java IO小结
package 字符与字节转换;
import java.io.*;
public class char_byte { public static void main(String[] args) {
// TODO 自动生成的方法存根 } } //理解1
/*java是面向对象的,所有的输入输出都是对 对象而言 以下面的为例 :FileOutputStream fos1 = new FileOutputStream("D:/abc1.txt");
对对象fos1来说文件是输出目标,而 FileInputStream fis2 = new FileInputStream("D:/abc2.txt");对象fis2的文件是输入来源。
*/ //理解2
/*
*输入流和输出流相对于内存设备而言:将外设中的数据读取到内存中:输入。
*将内存中的数据写出到外设中:输出。
*新生成的对象都是放在内存中的,上面的理解也大概是对的。
*/
//理解3
/*
流按照操作数据分为两种:字节流和字符流。
字符流的由来:其实就是字节流读取文字字节数据后,不直接操作而是先查指定的编码表,获取对应的文字,再对这个文字进行操作。简单来说:字节流+编码表。
/* //理解4
* 后缀名是父类名,前缀名是该流对象的功能。该对象可以直接操作的类型。read方法在提升,而write方法在降低。
*
//理解5
* writer reader 的本质实现是加了buff缓冲的字节,下面是字节转字符。
* public void write(int c) throws IOException {
synchronized (lock) {
ensureOpen();
if (nextChar >= nChars)
flushBuffer();
cb[nextChar++] = (char) c;
}
} FileOutputStream
三个主要的方法:
void write(int b) 写入一个int数字对应的byte,这点很奇怪:write(65535)和write(255)得到的结果是一致的,write方法只写入int b的最后面8位(一个byte)。需要注意一下。
void write(byte[] b) 写入一个byte数组。因为是字节流,所以在想用这个方法写入字符串到文件的时候,传入的参数应该是调用String类的getBytes方法将字符串转成byte数组再传入。
void write(byte[] b, int off, int len) 写入一个byte数组的制定起始脚标的长度。这个在拷贝文件或者网络传输的时候会常用的,因为需要数出的数据通常不会正好被byte数组b的长度整除,而是有多余的,这里就需要只输出多余的字节。 FileInputStream
int read() 从此输入流中读取一个数据字节。返回读到的byte的int形式,到文件末尾返回的是-1。
int read(byte[] b) 从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。返回的为读到的数组的长度。到文件末尾返回-1.
int read(byte[] b, int off, int len) 从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。返回的为读到的数组的长度。到文件末尾返回-1. */ class BinFileReadDemo {
public static void test1() throws IOException {
FileOutputStream fos1 = new FileOutputStream("D:/abc1.txt");
for (int x = 1; x < 512; x += 16) {
fos1.write(x);
}
fos1.close();
FileOutputStream fos2 = new FileOutputStream("D:/abc2.txt");
fos2.write("我是一个字符串".getBytes());
fos2.close();
} public static void test2() throws IOException {
FileInputStream fis1 = new FileInputStream("D:/abc1.txt");
int num1;
while ((num1 = fis1.read()) != -1) {
System.out.print(Integer.toHexString(num1) + " ");
}
fis1.close();
System.out.println("");
System.out.println("--------------------------------------------------");
FileInputStream fis2 = new FileInputStream("D:/abc2.txt");
int num2;
byte[] b = new byte[1024];
num2 = fis2.read(b);
System.out.write(b, 0, num2);
fis2.close();
}
//普通拷贝
public static void test3() throws IOException {
FileInputStream fis = new FileInputStream("D:/abc1.mp3");
FileOutputStream fos = new FileOutputStream("D:/abc2.mp3");
byte[] b = new byte[1024 * 1024];
int len;
while ((len = fis.read(b)) != -1) {
fos.write(b, 0, len);
}
fis.close();
fos.close();
}
//对于字节流,也有对应的增强类BufferedOutputStream和BufferedInputStream。
public static void test4() throws IOException {
long start = System.currentTimeMillis();
BufferedInputStream buffis = new BufferedInputStream(
new FileInputStream("D:/jdk-7u9-windows-x64.exe"));
BufferedOutputStream buffos = new BufferedOutputStream(
new FileOutputStream("D:/jdk-7u9-windows-x64-2.exe"));
int num;
while ((num = buffis.read()) != -1) {
buffos.write(num);
}
buffis.close();
buffos.close();
long end = System.currentTimeMillis();
System.out.println((end - start) + "毫秒");
}
//由用户输入字符串,代码将用户的键盘输入转成大写返回。
public static void test5() throws IOException {
InputStream in = System.in;
int b = 0;
StringBuilder sb = new StringBuilder();
while (true) {
b = in.read();
if ((char) b == '\r')
continue;
if ((char) b == '\n') {
String str = sb.toString();
if ("over".equals(str))
break;
System.out.println(str.toUpperCase());
sb.delete(0, sb.length());
}
else
sb.append((char) b);
}
in.close();
}
//考虑到处理换行,可使用BufferedReader,而且键盘输入是字节流,还要考虑到字节流向字符流的转换
public static void test6() throws IOException {
BufferedReader bufr = new BufferedReader(new InputStreamReader(
System.in));
String line = null;
while ((line = bufr.readLine()) != null) {
if ("over".equals(line))
break;
System.out.println(line.toUpperCase());
}
bufr.close();
}
//将键盘录入转成大写后输出到一个文件中
public static void test7() throws IOException {
BufferedReader bufr = new BufferedReader(new InputStreamReader(
System.in));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream("d:/www.txt")));
String line = null;
while ((line = bufr.readLine()) != null) {
if ("over".equals(line))
break;
bufw.write(line.toUpperCase());
bufw.newLine();
}
bufr.close();
bufw.close();
} }
[code=java] import java.io.*;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.util.ArrayList; import sun.nio.*;
class hello{
public static void main(String[] args)throws IOException{ main1();
main2();
main3();
main4(); } static void main1() throws IOException{
File resouceFile = new File("E:\\test.txt");
File targetFile = new File("E:\\copyOftest1.txt"); BufferedReader br = new BufferedReader(new FileReader(resouceFile));
BufferedWriter bw = new BufferedWriter(new FileWriter(targetFile));
String aString;
//char[] cbuf = new char[1024];
//int n = 0;
while((aString = br.readLine()) != null){
bw.write(aString);
bw.newLine();
}
//不要忘记刷新和关闭流、否则一方面资源没有及时释放、另一方面有可能照成数据丢失
br.close();
bw.flush();
bw.close();
} static void main2() throws IOException{
File resouceFile = new File("e:\\test.txt");
File targetFile = new File("E:\\copyOftest2.txt"); BufferedReader br = new BufferedReader(new FileReader(resouceFile));
BufferedWriter bw = new BufferedWriter(new FileWriter(targetFile)); char[] cbuf = new char[1024];
int n = 0;
while((n = br.read(cbuf)) != -1){
bw.write(cbuf, 0, n);
}
//不要忘记刷新和关闭流、否则一方面资源没有及时释放、另一方面有可能照成数据丢失
br.close();
bw.flush();
bw.close();
} static void main3() throws IOException{ //读取全部文件,但无法解析中文字符
RandomAccessFile testRFile=new RandomAccessFile("E:"+File.separator+"test.txt", "rw");
RandomAccessFile testWFile=new RandomAccessFile("E:"+File.separator+"test3.txt", "rw");
byte cc;
try{
while ((cc=testRFile.readByte())!=-1) {//按字节来写,那就不用在乎编码了!!但很难打印出来看。
//System.out.println((char)cc);
testWFile.write(cc);
}
}catch (Exception e) {
// TODO: handle exception
}
//File aFile=new File("E:"+File.separator+"test3.txt");
//OutputStream aa=new FileOutputStream(aFile);
//Writer out= new BufferedWriter(new OutputStreamWriter(aa));
//Writer out= new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File("E:"+File.separator+"test3.txt"))));
//输入字符串,缓存并以字节的形式保存文件
Writer out= new BufferedWriter(new OutputStreamWriter(new FileOutputStream("E:"+File.separator+"test3.txt")));
out.write("这是一个测试2");
out.flush();
out.close();
}
//上面是按一个字节一个字节的读写,比较慢,下面是优化,按一个数组一个数组的读写!
static void main4() throws IOException{
RandomAccessFile testRFile=new RandomAccessFile("E:"+File.separator+"test.txt", "rw");
RandomAccessFile testWFile=new RandomAccessFile("E:"+File.separator+"test4.txt", "rw");
int readsize=0;
for (int i=0;i<=(testRFile.length()/1024+1);i++){
byte[] bb=new byte[1024];
readsize=testRFile.read(bb);
System.out.println(readsize);
//System.out.println(new String(bb));
try {
testWFile.write(bb,0,readsize);
} catch (Exception e) {
// TODO: handle exception
} //System.out.println(new String(bb,"utf8"));//解析中文字符,但由于是数组形式的,会导致多余的null数据,可以用read时返回的int
//来知道读了多少字节,写入文件时,再写入缓存数组的相应长度,就能解决!完美!
}
testRFile.close();
testWFile.close(); } }
/*
* 泛型:泛型类型在逻辑上看以看成是多个不同的类型,实际上都是相同的基本类型。
* 类型通配符一般是使用 ? 代替具体的类型实参。注意了,此处是类型实参,而不是类型形参!且Box<?>在逻辑上是Box<Integer>、Box<Number>...等所有Box<具体类型实参>的父类。
* 类型通配符上限通过形如Box<? extends Number>形式定义,相对应的,类型通配符下限为Box<? super Number>形式
K —— 键,比如映射的键。
V —— 值,比如 List 和 Set 的内容,或者 Map 中的值。
E —— 异常类。
T —— 泛型。
List<?> 是任何泛型 List 的父类型
*/
class FanXing{
static void main1(){
ArrayList<String> qrrayList=new ArrayList<String>();
qrrayList.add("first1");
qrrayList.add("first2");
qrrayList.add("first3");
qrrayList.add("first4");
} } [/code]
[code=java]
/*
class FileChannelTest { RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt",
"rw");
FileChannel channel = aFile.getChannel(); String newData = "New String to write to file..." + System.currentTimeMillis(); //如果设置的大小不够存放newData,会抛异常java.nio.BufferOverflowException
ByteBuffer buf = ByteBuffer.allocate(48);
buf.clear();
buf.put(newData.getBytes()); buf.flip();//limit设置为当前的position,准备读取这个buffer //FileChannel.write()是在while循环中调用的。
//因为无法保证write()方法一次能向FileChannel写入多少字节
//因此需要重复调用write()方法,直到Buffer中已经没有尚未写入通道的字节
while(buf.hasRemaining()) {
channel.write(buf);
}
channel.close();
/**
* 还有如下方法
* channel.size()//该实例关联文件的大小
* channel.truncate() 截取文件,指定长度后的部分将被删除
* channel.force(true);//强制内存数据flush到硬盘 */
[/code]
java IO小结的更多相关文章
- Java IO 小结
Java IO 的学习需要明白流设计的体系结构,这样才能在实际需要的时候,通过API文档查阅,快速实现功能.
- java IO 流小结
java IO 流小结 java流类图结构 流的分类 按方向 输入流 输出流 按类型 字节流 字符流 结论:只要是处理纯文本数据,就优先考虑使用字符流. 除此之外都使用字节流.
- Java: IO 学习小结
源: 键盘 System.in 硬盘 FileStream 内存 ArrayStream 目的: 控制台 System.out 硬盘 FileStream 内存 ArrayStream 处理大文件或者 ...
- java IO回想小结
java IO原理 IO流用来处理设备之间的传输数据 输入(input):读取外部数据(磁盘.等存储设备)到程序() (内存)中 输出(output):将程序(内存)数据输出到磁盘等存储设备 java ...
- JAVA io 包小结
IO 无非读写 I --> Reader O--> Writer 为了方便字符 或者 文本文件的 操作创造出了 字符流 尤其是 缓冲字符输入输出流(BufferedReader,Buff ...
- [转]java:IO流学习小结
Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
- Java基础—IO小结(二)缓冲流与其它流的使用
一.缓冲流的使用 每个字节流都有对应的缓冲流: BufferedInputStream / BufferedOutputStream 构造器: 方法摘要与对应节点流类似 使用缓冲流实现文件复制:实际中 ...
- Java IO流
File类 ·java.io.File类:文件和目录路径名的抽象表示形式,与平台无关 ·File能新建.删除.重命名文件和目录,但File不能访问文件内容本身.如果需要访问文件内容本身,则需要使用输入 ...
- Java IO 之 FileInputStream & FileOutputStream源码分析
Writer :BYSocket(泥沙砖瓦浆木匠) 微 博:BYSocket 豆 瓣:BYSocket FaceBook:BYSocket Twitter ...
随机推荐
- 2018年第九届蓝桥杯【C++省赛B组】第三题 乘积尾零
如下的10行数据,每行有10个整数,请你求出它们的乘积的末尾有多少个零?5650 4542 3554 473 946 4114 3871 9073 90 43292758 7949 6113 5659 ...
- 2017.9.17 HTML学习总结---table标签
接上: 2.1.3 HTML表单标签与表单设计 表单是用户与服务器交互的主要方法,用户在表单中输入数据,提交给服务器程序来处理. (1)表单的组成: 文本框(text),密码框(password), ...
- clear:both;和overflow:hidden;的应用理解。
摘自cbwcwy 前辈: clear是子模块之间限定的,如下:<div id="a"> <div id="1"></div& ...
- wcf 的小介绍
http://www.cnblogs.com/scottckt/archive/2010/10/15/1852136.html
- MapReduce计算每年最大值测试样例生成程序
Demo.java package com.java; import java.io.BufferedWriter; import java.io.File; import java.io.FileW ...
- java基础 序列化反序列化流 实现Serializable 接口 自动装载序列号到对象文本文件如修改不能反序列化对象文本,除非自定义long型常量 打印流
package com.swift.baseKnowledge; import java.io.File; import java.io.FileInputStream; import java.io ...
- 深入理解java虚拟机学习笔记(一)JVM内存模型
上周末搬家后,家里的宽带一直没弄好,跟电信客服反映了N遍了终于约了个师傅明天早上来迁移宽带,可以结束一个多星期没网的痛苦日子了.这段时间也是各种忙,都一个星期没更新博客了,再不写之前那种状态和激情都要 ...
- Intellij IDEA 查找接口实现类的快捷键
查找接口的实现类: IDEA 风格 ctrl + alt +B 查看类或接口的继承关系: ctrl + h 1.IDEA_查找接口的实现 的快捷键 http://blog.csdn.net/u0100 ...
- Redis ---------- 持久化(AOF)操作
每小时做一次快照持久化 8:00 快照持久化 9:00 快照持久化 10:00 快照持久化 上帝想玩弄人类,突然停电,55万个key丢失了 11:00 快照持久化 解决方案: 8:00-9:00在 ...
- Python全栈day 04
Python全栈day 04 一.解释器/编译器 补充:编译型语言和解释型语言? # 编译型:代码写完后,编译器将其变成成另外一个文件,然后交给计算机执行. c c++,c# ,java # 解释型: ...