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: 编程问题中相当大的一部分都可以通过使用顺序编程来解决,然而,对于 ...
随机推荐
- 【CSS3】Advanced2:Shadows
1.Box Shadows box-shadow:h-shadow v-shadow [blur模糊距离 spread阴影尺寸 color inset]; 2. Text Shadows text-s ...
- 【JS】Intermediate8:jQuery:AJAX
1.$.ajax is the main method, allowing you to manually construct your AJAX request 2.eg: gets some da ...
- Win7 64位 安装E10后 打不开的解决方案 -摘自网络
但是后来发现点击IE图标没有任何反应,因此从网络上寻求帮助!将经验分享大家!进入注册表(运行regedit),找到 HKEY_CURRENT_USER\Software\Microsoft\Inter ...
- PHP 判断用户是否手机访问
$agent = check_wap(); if( $agent ) { header('Location: http://www.lewanau.com'); exit; } // check if ...
- C#编译器怎么检查代码是否会执行
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:C#编译器怎么检查代码是否会执行.
- Win7与虚拟机VMware下运行的Ubuntu共享文件夹
安装VMware Tools,在VMware面板上选择“虚拟机-重新安装VMware tools…”,如下图所示: 在这里VMware虚拟了一个光盘镜像,我们需要把这个镜像挂载到本机的/mnt目录下面 ...
- Android网络传输中必用的两个加密算法:MD5 和 RSA (附java完毕測试代码)
MD5和RSA是网络传输中最经常使用的两个算法,了解这两个算法原理后就能大致知道加密是怎么一回事了.但这两种算法使用环境有差异,刚好互补. 一.MD5算法 首先MD5是不可逆的,仅仅能加密而不能解密. ...
- jQuery -> 获取/设置/删除DOM元素的属性
jQuery的属性操作很easy,以下以一个a元素来说明属性的获取/设置/删除操作 <body> <a>jquery.com</a> </body> 加 ...
- OpenOffice的安装与启动2
1.tar -zxvfApache_OpenOffice_4.1.0_Linux_x86-64_install-rpm_zh-CN.tar.gz 2.cd zh-CN 3.rpm -Uvh RPM ...
- [Javascript] bukld 'SQL' like object tree
Let's try creating a deeper tree structure. This time we have 4 separate arrays each containing list ...