`
caoruntao
  • 浏览: 480910 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

j2se----File类和RandomAccessFile类[转]

    博客分类:
  • java
阅读更多
http://z466459262.iteye.com/blog/755238
先说说路径分隔符: Unix下的是 /  在Dos下的是 \

怎么记:从键盘上来记: U字符就像一个向下的降落的东西,所以找键盘上的下面的那个斜杠。。。。
File f = new File("aa\\b.txt");//这里Dos下的还需要转义,因为\在java中是一个用于转义的字符,所以使用Dos格式的时候需要转义。。。总结。。我们就用Unix下的格式吧。。。。。

好消息是:java是可以混淆这两种路径分隔符哈。。。

File是磁盘文件本身信息的类。。。。所以目录也是磁盘上的一种文件。。。。

File f= new File("a");


f.isDirectory();//是来判断他是否是一个目录

f.lastModified();//是得到文件最后的修改时间,这里返回long,我们要变成我们认识的东西还得使用Date,Date不仅接受String,他还接受所有基本类型

f.getParent(); //这个的意思是如果new 的时候是new File("aa\\b.txt");那么会返回aa,如果new File("b.txt") 那么返回null

默认情况下new File("/")代表的目录为:System.getProperty("user.dir");
形如:D:\program\openeap_devstudio\workspace\ctdmanager,也就是项目的根目录,下面有bin目录
new File("/").getAbsolutePath() //返回的是  D:\

String s = System.getProperty("user.dir")+"\\WebRoot\\images\\alert.gif";
File f = new File(s); //这样可以拿到webRoot下面的东西

//这里可以得到 meta-inf下的东西哦。。。。在jsp页面和java页面都可以,当然,因为他们都最后在bin目录下嘛
InputStream in = getClass().getResourceAsStream("/META-INF/corp_template.txt" );


注意:f.mkdirs();是建立目录,如果f是: C:/zz/1.txt
那么用这个命令也会建立一个1.txt的目录
File f = new File(root.toString());
File dirs = f.getParentFile();
if(!dirs.exists()){
	dirs.mkdirs();
}
--------------------------------------------------------------


RandomFileAccess类是 随机文件访问类,他提供了众多的文件访问方法

如果我们不想从头到尾开始读写文件,那么就要使用这个类。。。比如流媒体文件的应用中,比如断点续传中。。。。。。

这个就比流读取方式灵活多了

new RandomAccessFile(f,"rw");//对文件以读写方式打开
new RandomAccessFile(f,"r");//对文件以只读方式打开

String name="aaaa";
int age = 23;
RandomAccessFile ra = new RandomAccessFile(f,"rw");
ra.write(name.getBytes());//写入一个字节数组----这个不好控制,因为你先getBytes()是用操作系统的规范,所以你读出来不知道是多少字符,然后再写入,也就是说你写入的时候不知道是多少字符

改:ra.writeChars(name); //这样就写入了这个字符,我们规定name一定为8个字符,因为name是在java中给写入的,所以写入一定是16个字节,而且是用Unicode编码写入
对应的读取方式为:
String name = "";
for(int i=0;i<8;i++){
   name +=ra.readChar();
}
或者:因为我们知道是用Unicode写入,那么读取的时候当然知道怎么读取
byte[] buf = new byte[16];
int len = ra.read(buf);
String s = new String(buf,0,len);



ra.write(age);//这是写入一个字节,那么如果这个age大于一个字节,那么会发生丢失,怎么办呢?换下面的这个
ra.writeInt(age);//这样会四个字节哈。。。一定会把int完整写入

ra.close();

Byte[] buf = new Byte[8];
RandomAccessFile raf = new RandomAccessFile(f,"rw");
raf.skipBytes(12);//第一个员工的信息被跳过,因为String我们用一个buf[8]来接受,也就是说我们规定了name的最大长度为8byte,然后一个int为4byte,所以加起来为12byte....我们对String做了一件事,如果大于8个字符,那么截断,如果少于8个字符,那么补全。。。-----注意啦:如果我们用length来规定长度,他规定的是字符长度,并不等于我们在写入文件的时候是固定的字节长度



int retLen = raf.read(buf);//把读到的东西放到buf里面,因为我们知道我们文件的格式,所以就读8个,retLen为读到的长度,如果buf是8位,但是只读到了5为,那么就会返回5

下面要把buf转换成String ....要变字符串,当然是new String...一定会有相应的构造方法的,就像如果要把

String s = new String(buf,0,retLen);//把buf中从第0个到retLen个字节都拿出来组装成一个字符串

raf.seek(0);//跳转到0这个位置,这是绝对定位,也就是跳转到开始。。

raf.close();

raf.read()//读取1个字节的内容,因为我们明确知道是一个字节,所以返回值就不应该是一个字节的长度信息,这样很累赘,所以他返回的是读取的那个字节的内容
raf.readInt();//读取四个字节的整数来返回


raf.read(buf);//读取buf长度的信息,返回的是字节长度。。


在java中因为是unicode编码,所以中文和英文都占用两个字节的空间,但是在本地操作系统中英文是1个字节,汉字是两个字节

s.getBytes();//这个方法是根据本地操作系统来操作的,如果他碰到一个英文只会转换成一个字节,中文会转换成两个字节
比如:s = "张三\u0000\u0000\u0000\u0000\u0000\u0000"; s.length()为8,他指的是字符的长度
s.getBytes();//这个时候“张三”这两个字转换成了4个字节,而后面的转换成了6个字节,所以一共是10个字节

题目1:
1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。

public class MainClass{
	public static void main(String[] args) throws Exception{
		FileManager a = new FileManager("a.txt",new char[]{'\n'});
		FileManager b = new FileManager("b.txt",new char[]{'\n',' '});		
		FileWriter c = new FileWriter("c.txt");
		String aWord = null;
		String bWord = null;
		while((aWord = a.nextWord()) !=null ){
			c.write(aWord + "\n");
			bWord = b.nextWord();
			if(bWord != null)
				c.write(bWord + "\n");
		}
		
		while((bWord = b.nextWord()) != null){
			c.write(bWord + "\n");
		}	
		c.close();
	}
	
}


class FileManager{

	String[] words = null;
	int pos = 0;
	public FileManager(String filename,char[] seperators) throws Exception{
		File f = new File(filename);
		FileReader reader = new FileReader(f);
		char[] buf = new char[(int)f.length()]; //直接把文件全部都load到内存中。。好狠
		int len = reader.read(buf);
		String results = new String(buf,0,len);
		String regex = null;
		if(seperators.length >1 ){
			regex = "" + seperators[0] + "|" + seperators[1];
		}else{
			regex = "" + seperators[0];
		}
		words = results.split(regex);  //把整篇文章导成数组
	}
	
	public String nextWord(){
		if(pos == words.length)
			return null;
		return words[pos++]; 
	}
}

2。、编写一个程序,将d:\java目录下的所有.java文件复制到d:\jad目录下,并将原来文件的扩展名从.java改为.jad。
public class Jad2Java {

	public static void main(String[] args) throws Exception {
		File srcDir = new File("java");
		if(!(srcDir.exists() && srcDir.isDirectory()))
				throw new Exception("目录不存在");
		File[] files = srcDir.listFiles(
			new FilenameFilter(){

					public boolean accept(File dir, String name) {
						return name.endsWith(".java");
					}
					
				}
		);
		
		System.out.println(files.length);
		File destDir = new File("jad");
		if(!destDir.exists()) destDir.mkdir();
		for(File f :files){
			FileInputStream  fis = new FileInputStream(f);
			String destFileName = f.getName().replaceAll("\\.java$", ".jad");
			FileOutputStream fos = new FileOutputStream(new File(destDir,destFileName));
			copy(fis,fos);
			fis.close();
			fos.close();
		}
	}
	
	private static void copy(InputStream ips,OutputStream ops) throws Exception{
		int len = 0;
		byte[] buf = new byte[1024];
		while((len = ips.read(buf)) != -1){
			ops.write(buf,0,len);
		}

	}
}

 

分享到:
评论

相关推荐

    core-2.3.0 + QRCode + zxing-1.6-core + zxing-j2se-1.7

    这里提及的"zxing-1.6-core"和"zxing-j2se-1.7"分别是ZXing库的不同部分。 "zxing-1.6-core"是ZXing的核心模块,包含了读取和生成一维条形码和二维条形码(如QR码)的基本功能。它提供了API,让开发者可以轻松地...

    Java-J2se、J2ee开发全程视频教程和源码(87集)

    资源名称:Java-J2se、J2ee开发全程视频教程和源码(87集)资源目录:【】Java-J2se-J2ee全程教程(01-10)【】Java-J2se-J2ee全程教程(11-20)【】Java-J2se-J2ee全程教程(21-30)【】Java-J2se-J2ee全程教程(31...

    jaxmpp-j2se-3.0.0.jar(XMPP/Tigase开发,java代码类型客户端使用的jar包)

    jaxmpp-j2se-3.0.0.jar(XMPP/Tigase开发,java代码类型客户端使用的jar包) 需要的朋友自己下载,一个朋友让我帮他找的,就顺便发出来给更多需要的朋友吧

    core-3.3.3 + javase-3.3.3+ zxing-1.7-core + zxing-j2se-1.7

    本文将深入探讨在给定的压缩包中涉及的几个关键组件:`core-3.3.3`, `javase-3.3.3`, `zxing-1.7-core` 和 `zxing-j2se-1.7`,以及与之相关的JDK版本,包括JDK1.7和JDK1.8。这些组件主要用于二维码生成和处理,对于...

    j2se-doc-cn java的API文档,有助于你写JAVA程序

    这份名为“j2se-doc-cn”的压缩包包含的是Java API的中文版,对于中国开发者来说,无疑极大地便利了理解和使用Java语言。 在Java API文档中,你可以找到关于类库的详细信息,这些类库构成了Java开发的基础。例如,`...

    J2SE-孙鑫授课总结的ppt

    《J2SE-孙鑫授课总结的PPT》是一份深度总结Java标准版(Java 2 Platform, Standard Edition,简称J2SE)核心知识的教学资料,由知名IT教育专家孙鑫精心编撰。这份PPT涵盖了Java SE的各个方面,旨在帮助学习者系统地...

    zxing-code-1.7&amp;zxing-j2se-1.7[用于编解二维码].7z

    zxing-j2se-1.7[用于编解二维码].7z"压缩包包含的是ZXing项目的1.7版本,专门针对Java平台的版本,主要用途是处理二维码的编码和解码工作。 首先,我们来了解下ZXing的核心组件——zxing-core-1.7.jar。这个JAR文件...

    j2se-server.rar_connect

    标题“j2se-server.rar_connect”暗示我们关注的是Java SE(标准版)服务器端的连接技术,特别是与移动设备交互的代码。描述中提到的"connect mobile javacode"进一步明确了我们要探讨的是如何使用Java来实现移动...

    J2SE-IO.ppt

    Java中的IO流是Java平台标准版(J2SE)的核心特性之一,用于处理输入和输出操作。在Java中,流是一组数据的有序传输,可以是字节或字符。流的分类、节点流与处理流的概念,以及各种流类的使用方法是理解Java IO系统...

    j2se-Music

    本项目"j2se-Music"显然是基于J2SE实现的一个音乐管理系统的雏形,主要功能包括音乐信息的增加、删除、修改和查询。这个系统可能是一个控制台应用程序,用户通过命令行界面与之交互。 首先,让我们深入了解一下"增...

    J2SE-多线程.ppt

    Java J2SE中的多线程技术是编程中的重要概念,特别是在开发高效并发应用程序时。本篇内容主要围绕线程的基础知识、创建与启动、状态转换、控制方法、优先级以及线程组展开。 首先,线程被定义为程序内部的顺序控制...

    J2SE-API中文版

    javase 的api文档 学习java最基本的东西 大家应该都懂得

    actorframe-j2se-1.3.1-sources.jar

    官方版本,亲测可用

    actorframe-j2se-1.3.0-sources.jar

    官方版本,亲测可用

    actorframe-j2se-1.2.10-sources.jar

    官方版本,亲测可用

    actorframe-j2se-1.2.9-sources.jar

    官方版本,亲测可用

    actorframe-j2se-1.2.8-sources.jar

    官方版本,亲测可用

    actorframe-j2se-1.2.7-sources.jar

    官方版本,亲测可用

    actorframe-j2se-1.2.3-sources.jar

    官方版本,亲测可用

    actorframe-j2se-1.0.1-sources.jar

    官方版本,亲测可用

Global site tag (gtag.js) - Google Analytics