今天阿敏分享信息,聊到了java的IO流,下面就以此地来复习回顾一下IO流吧!
IO流的分类:
1、根据处理的数据类型不同:字节流和字符流。
2、根据流向不同:输入流和输出流。
3、根据流的功能不同:节点流和处理流。
IO流的四大抽象类:
字符流:Reader、Writer
字节流:InputStream、OutputSteam
字节流和字符流的区别:
1、字节流是每次读一个字节就返回一个字节,而字符流
可以读多个字节再返回。
2、字节流可以处理所有类型的数据,字符流只能处理字符数据。
总结:只是处理纯文本数据,就优先考虑使用字符流。
1、根据处理的数据类型不同:字节流和字符流。
2、根据流向不同:输入流和输出流。
3、根据流的功能不同:节点流和处理流。
IO流的四大抽象类:
字符流:Reader、Writer
字节流:InputStream、OutputSteam
字节流和字符流的区别:
1、字节流是每次读一个字节就返回一个字节,而字符流
可以读多个字节再返回。
2、字节流可以处理所有类型的数据,字符流只能处理字符数据。
总结:只是处理纯文本数据,就优先考虑使用字符流。
以下是他贴的代码:读文本文件
- FileReader fr=null;
- try {
- fr = new FileReader("D:\\test.sql");
- int ch = 0;
- while(( ch = fr.read()) != -1){
- System.out.println((char)ch);
- }
- } catch (IOException e) {
- e.printStackTrace();
- }finally{
- if(fr!=null){
- try {
- fr.close();
- } catch (IOException e1) {
- e1.printStackTrace();
- }
- }
- }
以下例子是简单的对一个文本文件读取,复制到另一个文本文件,为了提高效率可以考虑用包装流。其中还可以指定字符集。
- BufferedReader bufr = null;
- BufferedWriter bufw = null;
- try {
- bufr = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\test.sql"), "GBK"));
- bufw = new BufferedWriter(new FileWriter("D:\\test1.sql"));
- String line = null;
- while(( line = bufr.readLine()) != null){
- bufw.write(line);
- bufw.flush();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }finally{
- try {
- if(bufw!=null){
- bufw.close();
- }
- if(bufr!=null){
- bufr.close();
- }
- } catch (IOException e1) {
- e1.printStackTrace();
- }
- }
在日常应用读取文本文件最好就是
new BufferedReader(new InputStreamReader(new FileInputStream(filename), "GBK"))
这样指定一个字符集 乱码 没问题。
10**敏 10:58:33
对象流。。好少用,webservice中的VO传输就用到这个了
10**敏 11:00:55
ObjectInputStream
Object readObject();
ObjectOutputStream
void writeObject(Object):
主用就是用到以上两个方法
注意:写入对象必须实现Serializable 接口 。
对象流。。好少用,webservice中的VO传输就用到这个了
10**敏 11:00:55
ObjectInputStream
Object readObject();
ObjectOutputStream
void writeObject(Object):
主用就是用到以上两个方法
注意:写入对象必须实现Serializable 接口 。
10**敏 11:03:32
用于给类指定一个UID,而UID是通知类中的可序列化成员的数字签名运算出来的一个long型的值。。所有在weblogic或者Socket中传输。要是报了一个错什么序列版本不一致,你就知道就是这个UID,即两边的jar包不一样导致
所以有些人开发网络传输时,会指定一个UID值,而不是自动生成
上边的例子中
bufr = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\test.sql"), "GBK"));
其中InputStreamReader 是一个转换流,
特点:
1、是字节流和字符流之间的桥梁。
2、该流对象中可以对读取到的字节数据进行指定编码表的编码转换。
这里字节流就不细说了,代码实现跟字符流大同小异。
哦,还有一个比较少用的LineNumberReader
用于给类指定一个UID,而UID是通知类中的可序列化成员的数字签名运算出来的一个long型的值。。所有在weblogic或者Socket中传输。要是报了一个错什么序列版本不一致,你就知道就是这个UID,即两边的jar包不一样导致
所以有些人开发网络传输时,会指定一个UID值,而不是自动生成
上边的例子中
bufr = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\test.sql"), "GBK"));
其中InputStreamReader 是一个转换流,
特点:
1、是字节流和字符流之间的桥梁。
2、该流对象中可以对读取到的字节数据进行指定编码表的编码转换。
这里字节流就不细说了,代码实现跟字符流大同小异。
哦,还有一个比较少用的LineNumberReader
以上IO流的例子中,存在代码
try{
}catch(){
}finally{
};
try{
}catch(){
}finally{
};
这个是java控制异常的处理流程。当然finally不一定要。
finally的作用就是,每次运行代码,最终都会执行finally的代码块,例如用于,流的关闭。
finally的作用就是,每次运行代码,最终都会执行finally的代码块,例如用于,流的关闭。
总结:
日常应用用得最多的就是文本流,其中也有可能文本+图片的,这时可以用字节流,而一般为了提高效率,都会使用包装流对X流进行包装,最后,当成功打开流时,用完后不要忘记关闭哦。
======================================================================================================
以上就是阿敏同学分享的东西,下面我也来分享下我自己遇到的一个java的IO问题:
也就是读取jar包中的密钥文件,大体的情况是这样的,在我参与的某个项目当中,用户为了提高系统的安全性需要用到非对称的加密,而我所采用的非对称加密算法是RSA加密,页面上的用户登录密码采用RSA的公钥(javascript文件)进行加密,而后台采用java类写的解密方法解密,解密的过程需要读取密钥文件,所以就涉及到I/O方面的开销。
刚开始我只能读jar包外面的密钥文件,但是jar包内的密钥文件,我老是读取不到,后才找到方法。
- private static String RSAKeyStore = "c:/conf/RSAKey.txt";
- public static KeyPair getKeyPair() throws Exception {
- FileInputStream fis = new FileInputStream(RSAKeyStore);
- ObjectInputStream oos = new ObjectInputStream(fis);
- KeyPair kp = (KeyPair) oos.readObject();
- oos.close();
- fis.close();
- return kp;
- }
上面的方法就是第一次写的,写的方法就加载非jar包内的文件,这样的方式去读jar包内的文件是不可行的,如果想能读jar内的文件可以用下面的方法:
- ....
- private static String RSAKeyStore = "/net/thinkeye/util/RSAKey.txt";
- public static KeyPair getKeyPair() throws Exception {
- System.out.println("[开始]============[加载密钥]============[开始]");
- InputStream fis = RSAUtil.class.getResourceAsStream(RSAKeyStore);
- ObjectInputStream oos = new ObjectInputStream(fis);
- KeyPair kp = (KeyPair) oos.readObject();
- oos.close();
- fis.close();
- System.out.println("[结束]============[加载密钥]============[结束]");
- return kp;
- }
也就是读jar包内的文件,把FileInputStream 的文件直接改为InputStream ,直接使用类的getResourceAsStream方法去读jar包内文件,然后再转成对象流就ok了。
不信你试试。呵呵!至于更多的方法使用大家可以上网去找下,我也不多讲了。
本文出自 “新博客-http://cfei.net” 博客,请务必保留此出处http://johnny84.blog.51cto.com/2855387/957754