⑴ java如何实现文件系统
package com.kiritor.util;import java.io.File;import java.io.FileFilter;import java.util.Arrays;import java.util.Collections;import java.util.List;/*** 文件的相关操作类** @author Kiritor*/public class FileOperation {private static String contentPath;private static String filePath;private static File[] fileList = null;// 保存文件列表,过滤掉目录public FileOperation() {}/** 构造函数的参数是一个目录 */public FileOperation(String path) {File file = new File(path);if (file.isDirectory())this.contentPath = path;elsethis.filePath = path;}/**获取文件列表*/public static File[] getFiles() {if (contentPath == null) {File file = new File(filePath);fileList = new File[1];fileList[0] = file;return fileList;}fileList = new File(contentPath).listFiles(new FileFilter() {/**使用过滤器过滤掉目录*/@Overridepublic boolean accept(File pathname) {if(pathname.isDirectory()){return false;}elsereturn true;}});return fileList;}/** 对当前目录下的所有文件进行排序 */public static File[] sort() {getFiles();Arrays.sort(fileList, new FileComparator());return fileList;}public static void tree(File f, int level) {String preStr = "";for(int i=0; i<level; i++) {preStr += " ";}File[] childs = f.listFiles();//返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。for(int i=0; i<childs.length; i++) {System.out.println(preStr + childs[i].getName());if(childs[i].isDirectory()) {tree(childs[i], level + 1);}}}// 提供一个"比较器"static class FileComparator implements java.util.Comparator<File> {@Overridepublic int compare(File o1, File o2) {// 按照文件名的字典顺序进行比较return o1.getName().compareTo(o2.getName());}}}
⑵ 在Java中,()类提供定位本地文件系统的功能,对文件或目录及其属性进行基本操作.
d File请参看Java API ,在线地址 https://docs.oracle.com/javase/7/docs/api/java/io/File.html英文不好没关系,我已经版跟你说了是权选项 d File
⑶ java如何将文件上传其他服务器上 我的文件系统准备单独弄个系统,如何将文件上传到那个系统里
在目标系统上装个ftp服务器,然后用ftp协议上传文件或者在目标机器上装linux,就可以使用rsync, scp等方法传了
⑷ 有没有java api可以访问的分布式文件系统
fastdfs比较适合你的需求,但是这个是客户端有windows版,但是服务器端是没有的,也提供java的api。 小文件尤其适合。或者在你的windows上安装虚拟机的方式部署fastdfs,因为他是很轻量级的,所以安装起来没有一点问题。建议试试
⑸ 怎样用 filesystem java api 来实现查看文件系统空间总量 就相当于linux命令: hadoop fs – 的操作
众所周知,java在处理数据量比较大的时候,加载到内存必然会导致内存溢出,而在一些数据处理中我们不得不去处理海量数据,在做数据处理中,我们常见的手段是分解,压缩,并行,临时文件等方法; 例如,我们要将数据库(不论是什么数据库)的数据导出到一个文件,一般是Excel或文本格式的CSV;对于Excel来讲,对于POI和JXL的接口,你很多时候没有办法去控制内存什么时候向磁盘写入,很恶心,而且这些API在内存构造的对象大小将比数据原有的大小要大很多倍数,所以你不得不去拆分Excel,还好,POI开始意识到这个问题,在3.8.4的版本后,开始提供cache的行数,提供了SXSSFWorkbook的接口,可以设置在内存中的行数,不过可惜的是,他当你超过这个行数,每添加一行,它就将相对行数前面的一行写入磁盘(如你设置2000行的话,当你写第20001行的时候,他会将第一行写入磁盘),其实这个时候他些的临时文件,以至于不消耗内存,不过这样你会发现,刷磁盘的频率会非常高,我们的确不想这样,因为我们想让他达到一个范围一次性将数据刷如磁盘,比如一次刷1M之类的做法,可惜现在还没有这种API,很痛苦,我自己做过测试,通过写小的Excel比使用目前提供刷磁盘的API来写大文件,效率要高一些,而且这样如果访问的人稍微多一些磁盘IO可能会扛不住,因为IO资源是非常有限的,所以还是拆文件才是上策;而当我们写CSV,也就是文本类型的文件,我们很多时候是可以自己控制的,不过你不要用CSV自己提供的API,也是不太可控的,CSV本身就是文本文件,你按照文本格式写入即可被CSV识别出来;如何写入呢?下面来说说。。。 在处理数据层面,如从数据库中读取数据,生成本地文件,写代码为了方便,我们未必要1M怎么来处理,这个交给底层的驱动程序去拆分,对于我们的程序来讲我们认为它是连续写即可;我们比如想将一个1000W数据的数据库表,导出到文件;此时,你要么进行分页,oracle当然用三层包装即可,mysql用limit,不过分页每次都会新的查询,而且随着翻页,会越来越慢,其实我们想拿到一个句柄,然后向下游动,编译一部分数据(如10000行)将写文件一次(写文件细节不多说了,这个是最基本的),需要注意的时候每次buffer的数据,在用outputstream写入的时候,最好flush一下,将缓冲区清空下;接下来,执行一个没有where条件的SQL,会不会将内存撑爆?是的,这个问题我们值得去思考下,通过API发现可以对SQL进行一些操作,例如,通过:PreparedStatement statement = connection.prepareStatement(sql),这是默认得到的预编译,还可以通过设置: PreparedStatement statement = connection.prepareStatement(sql,ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY); 来设置游标的方式,以至于游标不是将数据直接cache到本地内存,然后通过设置statement.setFetchSize(200);设置游标每次遍历的大小;OK,这个其实我用过,oracle用了和没用没区别,因为oracle的jdbc API默认就是不会将数据cache到java的内存中的,而mysql里头设置根本无效,我上面说了一堆废话,呵呵,我只是想说,java提供的标准API也未必有效,很多时候要看厂商的实现机制,还有这个设置是很多网上说有效的,但是这纯属抄袭;对于oracle上面说了不用关心,他本身就不是cache到内存,所以java内存不会导致什么问题,如果是mysql,首先必须使用5以上的版本,然后在连接参数上加上useCursorFetch=true这个参数,至于游标大小可以通过连接参数上加上:defaultFetchSize=1000来设置,例如: jdbc:mysql://xxx.xxx.xxx.xxx:3306/abc?zeroDateTimeconvertToNull&useCursorFetch=true&defaultFetchSize=1000< /span> 上次被这个问题纠结了很久(mysql的数据老导致程序内存膨胀,并行2个直接系统就宕了),还去看了很多源码才发现奇迹竟然在这里,最后经过mysql文档的确认,然后进行测试,并行多个,而且数据量都是500W以上的,都不会导致内存膨胀,GC一切正常,这个问题终于完结了。 我们再聊聊其他的,数据拆分和合并,当数据文件多的时候我们想合并,当文件太大想要拆分,合并和拆分的过程也会遇到类似的问题,还好,这个在我们可控制的范围内,如果文件中的数据最终是可以组织的,那么在拆分和合并的时候,此时就不要按照数据逻辑行数来做了,因为行数最终你需要解释数据本身来判定,但是只是做拆分是没有必要的,你需要的是做二进制处理,在这个二进制处理过程,你要注意了,和平时read文件不要使用一样的方式,平时大多对一个文件读取只是用一次read操作,如果对于大文件内存肯定直接挂掉了,不用多说,你此时因该每次读取一个可控范围的数据,read方法提供了重载的offset和length的范围,这个在循环过程中自己可以计算出来,写入大文件和上面一样,不要读取到一定程序就要通过写入流flush到磁盘;其实对于小数据量的处理在现代的NIO技术的中也有用到,例如多个终端同时请求一个大文件下载,例如视频下载吧,在常规的情况下,如果用java的容器来处理,一般会发生两种情况: 其一为内存溢出,因为每个请求都要加载一个文件大小的内存甚至于更多,因为java包装的时候会产生很多其他的内存开销,如果使用二进制会产生得少一些,而且在经过输入输出流的过程中还会经历几次内存拷贝,当然如果有你类似nginx之类的中间件,那么你可以通过send_file模式发送出去,但是如果你要用程序来处理的时候,内存除非你足够大,但是java内存再大也会有GC的时候,如果你内存真的很大,GC的时候死定了,当然这个地方也可以考虑自己通过直接内存的调用和释放来实现,不过要求剩余的物理内存也足够大才行,那么足够大是多大呢?这个不好说,要看文件本身的大小和访问的频率; 其二为假如内存足够大,无限制大,那么此时的限制就是线程,传统的IO模型是线程是一个请求一个线程,这个线程从主线程从线程池中分配后,就开始工作,经过你的Context包装、Filter、拦截器、业务代码各个层次和业务逻辑、访问数据库、访问文件、渲染结果等等,其实整个过程线程都是被挂住的,所以这部分资源非常有限,而且如果是大文件操作是属于IO密集型的操作,大量的CPU时间是空余的,方法最直接当然是增加线程数来控制,当然内存足够大也有足够的空间来申请线程池,不过一般来讲一个进程的线程池一般会受到限制也不建议太多的,而在有限的系统资源下,要提高性能,我们开始有了new IO技术,也就是NIO技术,新版的里面又有了AIO技术,NIO只能算是异步IO,但是在中间读写过程仍然是阻塞的(也就是在真正的读写过程,但是不会去关心中途的响应),还未做到真正的异步IO,在监听connect的时候他是不需要很多线程参与的,有单独的线程去处理,连接也又传统的socket变成了selector,对于不需要进行数据处理的是无需分配线程处理的;而AIO通过了一种所谓的回调注册来完成,当然还需要OS的支持,当会掉的时候会去分配线程,目前还不是很成熟,性能最多和NIO吃平,不过随着技术发展,AIO必然会超越NIO,目前谷歌V8虚拟机引擎所驱动的node.js就是类似的模式,有关这种技术不是本文的说明重点; 将上面两者结合起来就是要解决大文件,还要并行度,最土的方法是将文件每次请求的大小降低到一定程度,如8K(这个大小是经过测试后网络传输较为适宜的大小,本地读取文件并不需要这么小),如果再做深入一些,可以做一定程度的cache,将多个请求的一样的文件,cache在内存或分布式缓存中,你不用将整个文件cache在内存中,将近期使用的cache几秒左右即可,或你可以采用一些热点的算法来配合;类似迅雷下载的断点传送中(不过迅雷的网络协议不太一样),它在处理下载数据的时候未必是连续的,只要最终能合并即可,在服务器端可以反过来,谁正好需要这块的数据,就给它就可以;才用NIO后,可以支持很大的连接和并发,本地通过NIO做socket连接测试,100个终端同时请求一个线程的服务器,正常的WEB应用是第一个文件没有发送完成,第二个请求要么等待,要么超时,要么直接拒绝得不到连接,改成NIO后此时100个请求都能连接上服务器端,服务端只需要1个线程来处理数据就可以,将很多数据传递给这些连接请求资源,每次读取一部分数据传递出去,不过可以计算的是,在总体长连接传输过程中总体效率并不会提升,只是相对相应和所开销的内存得到量化控制,这就是技术的魅力,也许不要太多的算法,不过你得懂他。 类似的数据处理还有很多,有些时候还会将就效率问题,比如在HBase的文件拆分和合并过程中,要不影响线上业务是比较难的事情,很多问题值得我们去研究场景,因为不同的场景有不同的方法去解决,但是大同小异,明白思想和方法,明白内存和体系架构,明白你所面临的是沈阳的场景,只是细节上改变可以带来惊人的效果。
⑹ 如何使用java读写nfs文件系统中的文件
用NFS方式挂载根文件系统 由于原来的内核是用ATBOOT的方式下载的,不知道怎么版传递参数(好像不能,权网上查的nfs方式都是用U-boot的方式挂载的),因此决定用u-boot重新下载内核。 1.下载u-boot和内核 1.1编译内核 1.1.1由于板子光盘自带的内核触…
⑺ java文件系统
第二来种和第三种,一样,自只不过调用不同的构造器达到一样的目的。都是新建文件输出流。第一种是RandomAccessFile是随机访问.. 既可以当输出流,也可以当输入流,随机访问体现在seek()方法,可以通过这个方法,指定指针的位置,从哪里开始读写
⑻ 用JAVA制作一个文件系统管理器文件目录浏览,创建目录,移动文件,文件改名,文件删除等等功能
FileInfoDirectory这两个类应该能满足你不行的话你搜下java文件操作什么都有了不行可以问我
⑼ 有没有用Java写的轻量级开源的分布式存储系统
以下内容源于分布式内存文件系统:Tachyon 14年9月的文章Tachyon是一个分布式内存文件系统,可以在集群里以访问内存的速度来访问存在tachyon里的文件。把Tachyon是架构在最底层的分布式文件存储和上层的各种计算框架之间的一种中间件。主要职责是将那些不需要落地到DFS里的文件,落地到分布式内存文件系统中,来达到共享内存,从而提高效率。同时可以减少内存冗余,GC时间等。<img src="https://pic3.mg.com/_b.png" data-rawwidth="810" data-rawheight="311" class="origin_image zh-lightbox-thumb" width="810" data-original="https://pic3.mg.com/_r.png">Tachyon架构Tachyon的架构是传统的Master—slave架构,这里和Hadoop类似,TachyonMaster里WorkflowManager是 Master进程,因为是为了防止单点问题,通过Zookeeper做了HA,可以部署多台Standby Master。Slave是由Worker Daemon和Ramdisk构成。这里个人理解只有Worker Daemon是基于JVM的,Ramdisk是一个off heap memory。Master和Worker直接的通讯协议是Thrift。下图来自Tachyon的作者Haoyuan Li:<img src="https://pic4.mg.com/_b.png" data-rawwidth="854" data-rawheight="571" class="origin_image zh-lightbox-thumb" width="854" data-original="https://pic4.mg.com/_r.png">三、Fault TolerantTachyon是一个分布式文件存储系统,但是如果Tachyon里的容错机制是怎么样的呢?Tachyon使用血统这个我们在Spark里的RDD里已经很熟悉了,这里也有血统这一概念。会使用血统,通过异步的向Tachyon的底层文件系统做Checkpoint。当我们向Tachyon里面写入文件的时候,Tachyon会在后台异步的把这个文件给checkpoint到它的底层存储,比如HDFS,S3.. etc…这里用到了一个Edge的算法,来决定checkpoint的顺序。比较好的策略是每次当前一个checkpoint完成之后,就会checkpoint一个最新生成的文件。当然想Hadoop,Hive这样的中间文件,需要删除的,是不需要checkpoint的。下图来自Tachyon的作者Haoyuan Li:<img src="https://pic1.mg.com/_b.png" data-rawwidth="822" data-rawheight="609" class="origin_image zh-lightbox-thumb" width="822" data-original="https://pic1.mg.com/_r.png">关于重新计算时,资源的分配策略:目前Tachyon支持2种资源分配策略:1、优先级的资源分配策略2、公平调度的分配策略<img src="https://pic2.mg.com/_b.png" data-rawwidth="940" data-rawheight="621" class="origin_image zh-lightbox-thumb" width="940" data-original="https://pic2.mg.com/_r.png">四、总结Tachyon是一个基于内存的分布式文件系统,通常位于分布式存储系统和计算框架直接,可以在不同框架内共享内存,同时可以减少内存冗余和基于Jvm内存计算框架的GC时间。Tachyon也有类似RDD的血统概念,input文件和output文件都是会有血统关系,这样来达到容错。并且Tachyon也利用血统关系,异步的做checkpoint,文件丢失情况下,也能利用两种资源分配策略来优先计算丢失掉的资源。
⑽ 怎么用java代码读取linux主机的磁盘使用信息,同时截取出文件系统和已使用情况 放在map中可以得到keyvalu
package com.cmmb.util;import java.io.*;/** * linux 下cpu 内存 磁盘 jvm的使用监控 * @author avery_leo * */ public class DiskSpace { /** * 获取cpu使用情况 * @return * @throws Exception */ public double getcpuUsage() throws Exception { double cpuUsed = 0; Runtime rt = Runtime.getRuntime(); Process p = rt.exec("top -b -n 1");// 调用系统的“top"命令 BufferedReader in = null; try { in = new BufferedReader(new InputStreamReader(p.getInputStream())); String str = null; String[] strArray = null; while ((str = in.readLine()) != null) { int m = 0; if (str.indexOf(" R ") != -1) {// 只分析正在运行的进程,top进程本身除外 && strArray = str.split(" "); for (String tmp : strArray) { if (tmp.trim().length() == 0) continue; if (++m == 9) {// 第9列为cpu的使用百分比(RedHat cpuUsed += Double.parseDouble(tmp); } } } } } catch (Exception e) { e.printStackTrace(); } finally { in.close(); } return cpuUsed; } /** * 内存监控 * @return * @throws Exception */ public double getMemUsage() throws Exception { double menUsed = 0; Runtime rt = Runtime.getRuntime(); Process p = rt.exec("top -b -n 1");// 调用系统的“top"命令 BufferedReader in = null; try { in = new BufferedReader(new InputStreamReader(p.getInputStream())); String str = null; String[] strArray = null; while ((str = in.readLine()) != null) { int m = 0; if (str.indexOf(" R ") != -1) {// 只分析正在运行的进程,top进程本身除外 && // // System.out.println("——————3—————–"); strArray = str.split(" "); for (String tmp : strArray) { if (tmp.trim().length() == 0) continue; if (++m == 10) { // 9)–第10列为mem的使用百分比(RedHat 9) menUsed += Double.parseDouble(tmp); } } } } } catch (Exception e) { e.printStackTrace(); } finally { in.close(); } return menUsed; } /** * 获取磁盘空间大小 * * @return * @throws Exception */ public double getDeskUsage() throws Exception { double totalhd = 0; double usedhd = 0; Runtime rt = Runtime.getRuntime(); Process p = rt.exec("df -hl /home");//df -hl 查看硬盘空间 BufferedReader in = null; try { in = new BufferedReader(new InputStreamReader(p.getInputStream())); String str = null; String[] strArray = null; while ((str = in.readLine()) != null) { int m = 0; strArray = str.split(" "); for (String tmp : strArray) { if (tmp.trim().length() == 0) continue; ++m; System.out.println("—-tmp—-" + tmp); if (tmp.indexOf("G") != -1) { if (m == 2) { System.out.println("—G—-" + tmp); if (!tmp.equals("") && !tmp.equals("0")) totalhd += Double.parseDouble(tmp .substring(0, tmp.length() – 1)) * 1024; } if (m == 3) { System.out.println("—G—-" + tmp); if (!tmp.equals("none") && !tmp.equals("0")) usedhd += Double.parseDouble(tmp.substring( 0, tmp.length() – 1)) * 1024; } } if (tmp.indexOf("M") != -1) { if (m == 2) { System.out.println("—M—" + tmp); if (!tmp.equals("") && !tmp.equals("0")) totalhd += Double.parseDouble(tmp .substring(0, tmp.length() – 1)); } if (m == 3) { System.out.println("—M—" + tmp); if (!tmp.equals("none") && !tmp.equals("0")) usedhd += Double.parseDouble(tmp.substring( 0, tmp.length() – 1)); System.out.println("—-3—-" + usedhd); } } } } } catch (Exception e) { e.printStackTrace(); } finally { in.close(); } //上面写在userd和total写反了,懒得改了,就反着用了 System.out.println("—-totalhd—-" + usedhd); System.out.println("—-usedhd—-" + totalhd); return (totalhd / usedhd) * 100; } public static void main(String[] args) throws Exception { DiskSpace cpu = new DiskSpace(); System.out.println("—————cpu used:" + cpu.getcpuUsage() + "%"); System.out.println("—————mem used:" + cpu.getMemUsage() + "%"); System.out.println("—————HD used:" + cpu.getDeskUsage() + "%"); System.out.println("————jvm监控———————-"); Runtime lRuntime = Runtime.getRuntime(); System.out.println("————–Free Momery:" + lRuntime.freeMemory()+"K"); System.out.println("————–Max Momery:" + lRuntime.maxMemory()+"K"); System.out.println("————–Total Momery:" + lRuntime.totalMemory()+"K"); System.out.println("—————Available Processors :" + lRuntime.availableProcessors()); } }
未经允许不得转载:山九号 » java文件系统|有没有用Java写的轻量级开源的分布式存储系统