为了实现,并发写操作,首先实验一下在本地情况下,

将一个文件切分成若干个 文件块 然后将文件块

通过多线程的并发的方式写入到指定目录下的文件中。

下面是简单的试着实现代码,暂时 先进行记录一下:

import java.io.FileInputStream ;
import java.io.FileOutputStream ;
import java.io.File;
import java.io.IOException ;
import java.nio.channels.FileChannel ;
import java.nio.ByteBuffer ; import java.lang.Thread; public class paralle
{ public static void main(String[] args) throws Exception
{
int MB64 = 1024 ;
File main_f = new File("d:\\test.txt") ;
System.out.println("success create file"+ main_f.getName()) ;
int pieceNum = (int)(main_f.length()/MB64) ;
System.out.println("we will divide the file into "+pieceNum+"pieces") ;
ByteBuffer [] blocks = new ByteBuffer[pieceNum]; File [] subFiles = new File[pieceNum] ; ThreadWrite [] subThread = new ThreadWrite [pieceNum] ; FileChannel finChannel = new FileInputStream (main_f).getChannel() ; for ( int i = 0 ; i < pieceNum ; i++)
{
blocks[i] = ByteBuffer.allocate(MB64);
finChannel.read(blocks[i]) ;
blocks[i].flip(); subThread[i] = new ThreadWrite(subFiles[i] , blocks[i] , i,main_f.getName()) ; subThread[i].start() ;
} } } class ThreadWrite extends Thread
{
File f ;
int currentNum ;
String name ;
ByteBuffer buffer ;
FileChannel foutChannel ; ThreadWrite(File f ,ByteBuffer buffer , int currentNum,String name)
{
this.f = f ;
this.currentNum = currentNum ;
this.buffer = buffer ;
this.name = name ;
} public void run()
{
try
{
name = new String ( "d:\\test1\\"+name +"_"+currentNum+".txt") ;
f = new File(name);
f.createNewFile();
foutChannel = new FileOutputStream (f).getChannel() ;
foutChannel.write(buffer);
buffer.clear() ; System.out.println("create new file :"+name) ;
}
catch (IOException e )
{
e.printStackTrace();
}
} }

思路很简单, 就是 实现设置一个 MB64 的整数值 对应的就是 block的单位 大小, 然后 获取待分割 的所谓的大文件,

然后 根据 block的大小 将大文件 分割成 n 份 , n = File.length() / MB64 ;

接下来, 创建一个 长度 为 n 的 继承了 Thread 可以实现多线程的 类的数组,

进行一个 n 的循环, 在循环中 为 分割的 每个File 的block 创建一个 子文件, 该文件中存放的是

File 中的各个 分割的 block 的内容, 并且在 文件输出的时候, 是以线程并发的方式 写进 子文件中的,

并且 子文件 的命名方式 是以 大文件+当前循环码(第几个block-1)+".txt"的生成方式,进行文件的生成的。

这样,在进行整体文件分割的时候, 可以很容易看出来, 那个是主文件, 那个是子文件。

------------------------------修改版---------------------------------

package parallel_write;

import java.io.FileInputStream ;
import java.io.FileOutputStream ;
import java.io.File ;
import java.io.IOException ;
import java.nio.channels.FileChannel ;
import java.nio.ByteBuffer ; import java.lang.Thread ; public class Main { public static void main(String[] args) throws Exception
{
String path = new String ("test.txt") ;
//test.txt file in included in the project floder Divide_LargeFile divFile = new Divide_LargeFile(path) ; divFile.divideFile(); } } class Divide_LargeFile
{
final static int MB64 = 1024 ;
File main_f ;
int blockNum ;
ByteBuffer [] blocks ;
File [] subFiles ;
ThreadWrite [] subThread ; Divide_LargeFile ( String path )
{
this.main_f = new File ( "test.txt" ) ;
System.out.println("success create file "+main_f.getName()) ; } public void divideFile ()throws Exception
{
this.blockNum = (int)(main_f.length()/MB64) ;
System.out.println("large file is divided into "+blockNum+" blocks") ; ByteBuffer [] blocks = new ByteBuffer[blockNum] ;
//we can regard block as a contianer which gets size MB64 bytes everytime from large fine this.subFiles = new File[blockNum] ;
// new some File objects , but system didn't allocate capacity for
//each File objects in the array this.subThread = new ThreadWrite[blockNum] ;
//number of subThread equals to the subFile's number FileChannel finChannel = new FileInputStream(main_f).getChannel() ; for ( int i = 0 ; i < blockNum; i++)
{
blocks[i] = ByteBuffer.allocate(MB64); finChannel.read(blocks[i]);
blocks[i].flip() ; subThread[i] = new ThreadWrite(subFiles[i] , blocks[i],i, main_f.getName()) ; subThread[i].start();
}
  
     finChannel.close() ; } } class ThreadWrite extends Thread
{
File f ;
int currentNum ;
String fileName ;
ByteBuffer buffer ;
FileChannel foutChannel ; ThreadWrite ( File f , ByteBuffer buffer , int curNum , String fileName)
{
this.f = f ;
this.buffer = buffer ;
this.currentNum = curNum ;
this.fileName = fileName ;
} public void run ()
{
try
{
fileName = new String (fileName+"_"+currentNum+".txt") ;
f = new File (fileName) ;
f.createNewFile(); foutChannel = new FileOutputStream(f).getChannel() ;
foutChannel.write(buffer) ;
buffer.clear() ; System.out.println("create new file"+fileName) ; } catch (IOException e )
{
e.printStackTrace();
} }
}

接下来要进行分析的是,

如何在Client 端 调用 相关的hadoop 方法 来根据 相关Path 在HDFS 端 创建一个 File,

并一次性 为该 File 在NameNode上面 添加 相关的节点, 并且可以 通过 相关调用 在Datanode 上面

一次性为 File 分割成 block 的数目 n 分配相应数量 的 replica。

相关类有:

FSDirectory.addFile.java

FSDirectory.addNode.java

FSDirector.addBlock.java

1_使用Java文件的并发写的更多相关文章

  1. 一个.java文件内只能写一个class吗

    先给结论:当然不是!! 可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致.一个文件中可以不含public类,如果只有一个非public类,此时可以跟文件名不同. 为 ...

  2. java 文件读和写(整理)

    1 读文件 1)按字节读取,FileInputStream用于读二进制文件,如,图片,声音,影像等 /** * 以字节为单位读取文件,常用于读二进制文件,如图片.声音.影像等文件. */ public ...

  3. JAVA调用C语言写的SO文件

    JAVA调用C语言写的SO文件 因为工作需要写一份SO文件,作为手机硬件IC读卡和APK交互的桥梁,也就是中间件,看了网上有说到JNI接口技术实现,这里转载了一个实例 // 用JNI实现 // 实例: ...

  4. Python3并发写文件

    使用python2在进行并发写的时候,发现文件会乱掉,就是某一行中间会插入其他行的内容. 但是在使用python3进行并发写的时候,无论是多进程,还是多线程,都没有出现这个问题,难道是python3的 ...

  5. 可以在一个.java文件中写两个类吗?

    一个java文件中可以有任意多个类,接口或是注解..但是只能有一个类是public的,而且这个类的名字要和文件同名,比如public类名为A则文件名就应当为A.java

  6. 深入浅出JVM(一):你写得.java文件是如何被加载到内存中执行的

    众所周知,.java文件需要经过编译生成.class文件才能被JVM执行. 其中,JVM是如何加载.class文件,又做了些什么呢? .class文件通过 加载->验证->准备->解 ...

  7. java处理高并发高负载类网站的优化方法

    java处理高并发高负载类网站中数据库的设计方法(java教程,java处理大量数据,java高负载数据) 一:高并发高负载类网站关注点之数据库 没错,首先是数据库,这是大多数应用所面临的首个SPOF ...

  8. JAVA 文件编译执行与虚拟机(JVM)简单介绍

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytpo3 java程序的内存分配 JAVA 文件编译执行与虚拟机(JVM)介绍 ...

  9. Java编程思想 - 并发

    前言 Q: 为什么学习并发? A: 到目前为止,你学到的都是有关顺序编程的知识,即程序中的所有事物在任意时刻都只能执行一个步骤. A: 编程问题中相当大的一部分都可以通过使用顺序编程来解决,然而,对于 ...

随机推荐

  1. c# PrintDocument 设置自定义纸张大小的示例

    .Net 提供的打印类PrintDocument 非常简洁易用,不过在实际应用开发中往往需要对纸张进行自定义,尤其是需要进行票据打印时.这个问题也困扰了我许久,经过查阅相关的资料和多次尝试,发现 其实 ...

  2. python模拟登录人人网

    参考: http://www.cnblogs.com/txw1958/archive/2012/03/12/2392067.html http://www.cnblogs.com/chenyg32/a ...

  3. Pascal's Triangle II

    1.题目描述 Given an index k, return the kth row of the Pascal's triangle.   For example, given k = 3, Re ...

  4. virtualenv下配置nginx uwsgi Django

    1.安装virtualenv,创建虚拟环境django15 sudo apt-get install virtualenv virtualenv env source bin/active pip i ...

  5. POJ3009 Curling 2.0

    正式做POJ的第一题,做出来后又看了别人的代码,就又完善了一下,也通过了.参考 http://blog.sina.com.cn/s/blog_4abcd9bc0100phzb.html 改了之后觉得写 ...

  6. 最简单的基于FFMPEG的音频编码器(PCM编码为AAC)

    http://blog.csdn.net/leixiaohua1020/article/details/25430449 本文介绍一个最简单的基于FFMPEG的音频编码器.该编码器实现了PCM音频采样 ...

  7. devexpress中gridcontrol 一些样式改变

    改变footer为扁平化效果 整个footer背景色CustomDrawFootere.Appearance.BackColor = Color.Transparent; e.Appearance.D ...

  8. SQL SERVER 导入EXCEL的存储过程

    1.先在查询分析器里执行 exec sp_configure "show advanced options",1 reconfigure exec sp_configure &qu ...

  9. 分布式搜索elasticsearch 索引文档的增删改查 入门

    1.RESTful接口使用方法 为了方便直观我们使用Head插件提供的接口进行演示,实际上内部调用的RESTful接口. RESTful接口URL的格式: http://localhost:9200/ ...

  10. 如何减少不能重现的Bug

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:如何减少不能重现的Bug.