文档章节

18 IO 字符集编码

恋佳
 恋佳
发布于 2015/07/22 14:06
字数 1558
阅读 3
收藏 0

1、File

一个File类的对象,表示了磁盘上的文件或目录

•File类提供了与平台无关的方法来对磁盘上的文件或目录进行操作
•File类直接处理文件和文件系统。

•File类没有指定信息怎样从文件读取或向文件存储

File myFile = new File(" myfile. txt");
File myDir = new File(" MyDocs");
File myFile = new File( myDir, "myfile. txt");
这些构造方法取决于访问文件的方式。例如,若在应用程序里只用一个文件,第一种创建文件的结构是最容易的。但若在同一目录里打开数个文件,则后种方法更好一些。


判断是文件还是目录

file.isDirectory();
file.isFile();
创建目录

File  file =new  File("D:/wang/bing/jia");
System.out.println(file.isDirectory());
file.mkdirs();
System.out.println(file.isDirectory());
过滤文件:利用匿名内部类

String [] names=	file.list(new FilenameFilter()
		{
			
			@Override
			public boolean accept(File dir, String name)
			{
				if (name .endsWith(".txt"))
				{
					return true;
					}
				return false;
			}
		});



2、stream

字节流 
InputStream

FileInputStream fileInputStream1=new FileInputStream("D:/bingjia.txt");
	byte []buffer=new  byte [1024];
	int length=fileInputStream1.read(buffer,0,buffer.length);
	while(length!=-1)
	{
		String string =new String(buffer,0,length);
		System.out.println(string);
		length=fileInputStream1.read(buffer,0,buffer.length);
	}
	fileInputStream1.close();
OutPutStream



OutputStream outputStream =new FileOutputStream("D:/miss.txt");
	
	String string ="i miss you";
	
	byte [] bufferwrite=string.getBytes();
	
	outputStream.write(bufferwrite);
	
	outputStream.close();
缓冲字节流
通过把内存缓冲区连到输入/输出流扩展一个过滤流类。该缓冲区允许Java对多个字节同时进行输入/输出操作,提高了程序性能。

OutputStream outputStream=new FileOutputStream("D:/miss1.txt");
		BufferedOutputStream bufferedOutputStream=new BufferedOutputStream(outputStream);
		
		bufferedOutputStream.write("i miss you".getBytes());
		
		bufferedOutputStream.close();


数据文件流

DataOutputStream(写入二进制文件)

写文件

DataOutputStream dataOutputStream=new DataOutputStream (new BufferedOutputStream(new FileOutputStream("D:/missbingjia.txt")));
		byte a=1;
		int b=222;
		char c='b';
		
		dataOutputStream.writeByte(a);
		dataOutputStream.writeInt(b);
		dataOutputStream.writeChar(c);
		
		dataOutputStream.close();

DataInputStream(读取二进制文件)

读文件

DataInputStream dataInputStream=new DataInputStream(new BufferedInputStream(new FileInputStream("D:/missbingjia")));
		System.out.println(dataInputStream.readByte());
		System.out.println(dataInputStream.readInt());
		System.out.println(dataInputStream.readChar());

字符流


尽管字节流提供了处理任何类型输入/输出操作的足够的功能,它们不能直接操作Unicode字符。既然Java的一个主要目的是支持“只写一次,到处运行”的哲学,包括直接的字符输入/输出支持是必要的。

由于Java采用16位的Unicode字符,因此需要基于字符的输入/输出操作。从Java1.1版开始,加入了专门处理字符流的抽象类Reader和Writer,前者用于处理输入,后者用于处理输出。这两个类类似于InputStream和OuputStream,也只是提供一些用于字符流的规定,本身不能用来生成对象

Java程序语言使用Unicode来表示字符串和字符, Unicode使用两个字节来表示一个字符,即一个字符占16位

FileOutputStream fos = new FileOutputStream("file.txt");
		
		OutputStreamWriter osw = new OutputStreamWriter(fos);
		
		BufferedWriter bw = new BufferedWriter(osw);
		
		bw.write("http://www.google.com");
		bw.write("\n");
		bw.write("http://www.baidu.com");
		
		bw.close();
		
		FileInputStream fis = new FileInputStream("file.txt");
		InputStreamReader isr = new InputStreamReader(fis);
		BufferedReader br = new BufferedReader(isr);
		
		
		String str = br.readLine();
		
		while(null != str)
		{
			System.out.println(str);
			
			str = br.readLine();
		}
		
		br.close();

FileReader FileWriter

FileReader fileReader=new FileReader("D:/bingjia.txt");
		char []buffer=new char [1024];
		fileReader.read(buffer);
		fileReader.close();
		System.out.println(new String(buffer));

ASCII

ASCII码与一个8位(bit)二进制数对应。其最高位是0,相应的十进制数是0-127。如,数字“0”的编码用十进制数表示就是48。另有128个扩展的ASCII码,最高位都是1,由一些制表符和其它符号组成。ASCII是现今最通用的单字节编码系统。

Unicode

Unicode:这是一种通用的字符集,对所有语言的文字进行了统一编码,对每一个字符都用2个字节来表示,对于英文字符采取前面加“0”字节的策略实现等长兼容。如 “a” 的ASCII码为0x61,UNICODE就为0x00,0x61。(在internet上传输效率较低)

UTF-8

Eight-bit UCS Transformation Format,(UCS,Universal Character Set,通用字符集,UCS 是所有其他字符集标准的一个超集)。一个7位的ASCII码值,对应的UTF码是一个字节。如果字符是0x0000,或在0x0080与0x007f之间,对应的UTF码是两个字节,如果字符在0x0800与0xffff之间,对应的UTF码是三个字节(汉字为3个字节)  不等长

RandomAccessFile

RandomAccessFile类同时实现了DataInput和DataOutput接口,提供了对文件随机存取的功能,利用这个类可以在文件的任何位置读取或写入数据。
•RandomAccessFile类提供了一个文件指针,用来标志要进行读写操作的下一数据的位置。

RandomAccessFile raf = new RandomAccessFile("test.txt", "rw");
public void write(RandomAccessFile raf) throws Exception
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>raf.writeInt(this.id);
<span style="white-space:pre">		</span>raf.writeUTF(this.name);
<span style="white-space:pre">		</span>raf.writeDouble(this.height);
<span style="white-space:pre">	</span>}


<span style="white-space:pre">	</span>public void read(RandomAccessFile raf) throws Exception
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>this.id = raf.readInt();
<span style="white-space:pre">		</span>this.name = raf.readUTF();
<span style="white-space:pre">		</span>this.height = raf.readDouble();
<span style="white-space:pre">	</span>}

序列化

将对象转换为字节流保存起来,并在以后还原这个对象,这种机制叫做对象序列化。

一个类若想被序列化,则需要实现java.io.Serializable接口,该接口中没有定义任何方法,是一个标识性接口(Marker Interface),当一个类实现了该接口,就表示这个类的对象是可以序列化的。



在序列化时,static变量是无法序列化的;如果A包含了对B的引用,那么在序列化A的时候也会将B一并地序列化;如果此时A可以序列化,B无法序列化,那么当序列化A的时候就会发生异常,这时就需要将对B的引用设为transient,该关键字表示变量不会被序列化。

class Person implements Serializable
{
	int age;

	String name;

	double height;

	public Person(int age, String name, double height)
	{
		this.age = age;
		this.name = name;
		this.height = height;
	}
}

public static void main(String[] args) throws Exception
	{
		Person p1 = new Person(20, "zhangsan", 4.55);
		Person p2 = new Person(50, "lisi", 4.67);
		Person p3 = new Person(10, "wangwu", 17.78);

		FileOutputStream fos = new FileOutputStream("person.txt");

		ObjectOutputStream oos = new ObjectOutputStream(fos);

		oos.writeObject(p1);
		oos.writeObject(p2);
		oos.writeObject(p3);

		oos.close();

		System.out.println("--------------------");

		FileInputStream fis = new FileInputStream("person.txt");

		ObjectInputStream ois = new ObjectInputStream(fis);

		Person p = null;

		for (int i = 0; i < 3; i++)
		{
			p = (Person) ois.readObject();

			System.out.println(p.age + "," + p.name + "," + p.height);
		}

		ois.close();
	}

当我们在一个待序列化/反序列化的类中实现了以上两个private方法(方法声明要与上面的保持完全的一致),那么就允许我们以更加底层、更加细粒度的方式控制序列化/反序列化的过程。


© 著作权归作者所有

恋佳
粉丝 0
博文 76
码字总数 62107
作品 0
大连
私信 提问
Java中关于乱码的认识和解决办法

前几天在使用中兴的MM7接口开发一个彩信的应用,可是在测试的时候,手机收到的文本内容总是一堆乱码,不管怎么修改参数问题都得不到解决,于是就狠狠的琢磨和研究了下关于编码的内容,最终成...

mybabe0312
2015/12/30
0
0
MySQL中出现乱码问题的终极解决宝典

MySQL中出现乱码问题的终极解决宝典 这篇文章主要介绍了MySQL中出现乱码问题的终极解决宝典,包括编码转换和SQL数据进出等方面,无比给力,极力推荐这篇精华翻译!需要的朋友可以参考下 MySQL出现...

xiaocao13140
2018/06/04
0
0
ASCII,ANSI,UNICODE,UTF-8,UNICOD BIG Endian 等字符编码问题

字符集简史: 在所有字符集中,最知名可能要数被称为ASCII的7位字符集了。它是美国信息交换标准委员会(American Standards Committee for Information Interchange)的缩写, 为美国英语通信...

learningloong
2010/09/24
0
0
Java获取网页编码

使用爬虫从网上抓取到一个网页内容,要想能正确显示,必须要获取网页的原始编码,否则会出现乱码。首先需要获取网页内容,最简单的办法就是通过JDK自带的HttpURLConnection类,要实现更复杂的...

Jansens
2016/10/25
11
0
git clone的源码在vim打开时是乱码

起因:昨天从github clone源码时,有些readme.txt的文件在vim打开时变成了乱码。在网上找了一下答案,都说是linux的字符集和windows的字符集不兼容导致的,并不是github或是vim的问题。但没有...

郭大布
2015/09/02
131
0

没有更多内容

加载失败,请刷新页面

加载更多

idea运行spring boot(推荐)

下载idea 注册激活:http://idea.lanyus.com/ 照着网上的步骤创建spring boot,这里记录存在的坑 首先gradle需要在本地配置环境变量,配制成本地的,联网下载的话要很久很久 第一次不要使用g...

安卓工程师王恒
12分钟前
1
0
java final学习笔记

代码如下:class Circle{ double r; double pi=3.14; public Circle(double r) { this.r=r; } public void getArea() { System.out.......

hellation_
30分钟前
0
0
JavaConfig版

中心思想:去xml配置文件。 在Spirng Boot和Spring Cloud中,大量使用了注解与JavaConfig。 xml文件 对应的Java类 spring.xml SpringConfig.java spring-mvc.xml SpringMvcConfig.java web.x...

流小文
49分钟前
4
0
Go 定时器内部实现原理剖析

前言 前面我们介绍了一次性定时器Timer和周期性定时器Ticker,这两种定时器内部实现机制相同。创建定时器的协程并不负责计时,而是把任务交给系统协程,系统协程统一处理所有的定时器。 本节...

恋恋美食
54分钟前
5
0
分布式协调神器 ZooKeeper 之整体概述

ZooKeeper 最早起源于雅虎研究院的一个研究小组。当时,雅虎内部很多大型系统基本都需要依赖一个类似的系统来进行分布式协调,但是这些系统往往都存在分布式单点问题。所以,雅虎的开发人员就...

别打我会飞
55分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部