1_使用Java文件的并发写
为了实现,并发写操作,首先实验一下在本地情况下,
将一个文件切分成若干个 文件块 然后将文件块
通过多线程的并发的方式写入到指定目录下的文件中。
下面是简单的试着实现代码,暂时 先进行记录一下:
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文件的并发写的更多相关文章
- 一个.java文件内只能写一个class吗
先给结论:当然不是!! 可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致.一个文件中可以不含public类,如果只有一个非public类,此时可以跟文件名不同. 为 ...
- java 文件读和写(整理)
1 读文件 1)按字节读取,FileInputStream用于读二进制文件,如,图片,声音,影像等 /** * 以字节为单位读取文件,常用于读二进制文件,如图片.声音.影像等文件. */ public ...
- JAVA调用C语言写的SO文件
JAVA调用C语言写的SO文件 因为工作需要写一份SO文件,作为手机硬件IC读卡和APK交互的桥梁,也就是中间件,看了网上有说到JNI接口技术实现,这里转载了一个实例 // 用JNI实现 // 实例: ...
- Python3并发写文件
使用python2在进行并发写的时候,发现文件会乱掉,就是某一行中间会插入其他行的内容. 但是在使用python3进行并发写的时候,无论是多进程,还是多线程,都没有出现这个问题,难道是python3的 ...
- 可以在一个.java文件中写两个类吗?
一个java文件中可以有任意多个类,接口或是注解..但是只能有一个类是public的,而且这个类的名字要和文件同名,比如public类名为A则文件名就应当为A.java
- 深入浅出JVM(一):你写得.java文件是如何被加载到内存中执行的
众所周知,.java文件需要经过编译生成.class文件才能被JVM执行. 其中,JVM是如何加载.class文件,又做了些什么呢? .class文件通过 加载->验证->准备->解 ...
- java处理高并发高负载类网站的优化方法
java处理高并发高负载类网站中数据库的设计方法(java教程,java处理大量数据,java高负载数据) 一:高并发高负载类网站关注点之数据库 没错,首先是数据库,这是大多数应用所面临的首个SPOF ...
- JAVA 文件编译执行与虚拟机(JVM)简单介绍
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytpo3 java程序的内存分配 JAVA 文件编译执行与虚拟机(JVM)介绍 ...
- Java编程思想 - 并发
前言 Q: 为什么学习并发? A: 到目前为止,你学到的都是有关顺序编程的知识,即程序中的所有事物在任意时刻都只能执行一个步骤. A: 编程问题中相当大的一部分都可以通过使用顺序编程来解决,然而,对于 ...
随机推荐
- c# PrintDocument 设置自定义纸张大小的示例
.Net 提供的打印类PrintDocument 非常简洁易用,不过在实际应用开发中往往需要对纸张进行自定义,尤其是需要进行票据打印时.这个问题也困扰了我许久,经过查阅相关的资料和多次尝试,发现 其实 ...
- python模拟登录人人网
参考: http://www.cnblogs.com/txw1958/archive/2012/03/12/2392067.html http://www.cnblogs.com/chenyg32/a ...
- Pascal's Triangle II
1.题目描述 Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Re ...
- virtualenv下配置nginx uwsgi Django
1.安装virtualenv,创建虚拟环境django15 sudo apt-get install virtualenv virtualenv env source bin/active pip i ...
- POJ3009 Curling 2.0
正式做POJ的第一题,做出来后又看了别人的代码,就又完善了一下,也通过了.参考 http://blog.sina.com.cn/s/blog_4abcd9bc0100phzb.html 改了之后觉得写 ...
- 最简单的基于FFMPEG的音频编码器(PCM编码为AAC)
http://blog.csdn.net/leixiaohua1020/article/details/25430449 本文介绍一个最简单的基于FFMPEG的音频编码器.该编码器实现了PCM音频采样 ...
- devexpress中gridcontrol 一些样式改变
改变footer为扁平化效果 整个footer背景色CustomDrawFootere.Appearance.BackColor = Color.Transparent; e.Appearance.D ...
- SQL SERVER 导入EXCEL的存储过程
1.先在查询分析器里执行 exec sp_configure "show advanced options",1 reconfigure exec sp_configure &qu ...
- 分布式搜索elasticsearch 索引文档的增删改查 入门
1.RESTful接口使用方法 为了方便直观我们使用Head插件提供的接口进行演示,实际上内部调用的RESTful接口. RESTful接口URL的格式: http://localhost:9200/ ...
- 如何减少不能重现的Bug
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:如何减少不能重现的Bug.