`

字节流,字符流,对象流,序列化,持久化

    博客分类:
  • j2se
 
阅读更多

第一:读写字符串

input(读文件里的内容) 的步骤:
对于文件里的内容,是个很长的字符串,而我们每次要读取的是一个字节数组或者一个字符数组
1.读字符串(文件里的内容),可以按字节读,也可以按字节数组读
2.输出(如果是按照字节读的就按照字节输出,如果是按照字节数组读的就按照字符串的方式输出)


output:(把东西(字符串)写入文件)
1.先定义一个字符串
2.将字符串转化成字节数组(两种方式基本一样,第一种因为是一个一个的输出,因此多了一个for循环)
3,然后写入,输出

 

Reader:字符输入流(抽象类)
       FileReader:文件字符输入流
       int read()  int :读取字符的编码
       int read(char []ch) int表示读取字符的个数  ,ch是读取的字符内容
       
Writer:字符输出流(抽象类):必须刷新
     实现类:
        (1).FileWriter(文件输出流,处理流)                   
         (2).write(int c)c是要写入字符的编码
flash:写的时候都写入了内存(这时候内存中是二进制),内存中现在把编码组织好了(变成自己能够看的),之后刷新,就把字符放入了文件中。
close里面自动调用了flash,因此close方法也会达到刷新的作用。

注意:

InputStream 和OutputStream,两个是为字节流设计的,主要用来处理字节或二进制对象,
Reader和 Writer.两个是为字符流(一个字符占两个字节)设计的,主要用来处理字符或字符串

 

第二:读写字符串相关代码(字符流:输入流与输出流)

package com.charTest;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class ReaderWriterTest {
 /**
  *
  *  @方法的作用:字符输入输出流
  *  @作者:褚永也
  *  @日期:2014-7-16 下午4:33:25
  *  @返回值类型:void
  */
 public static void main(String[] args) {
  File file = new File("src/com/charTEst/test.txt");
  
  write1(file);
  write2(file);
  System.out.println("--------------------");
  read1(file);
  
  read2(file);
 }
 /**
  *
  *  @方法的作用:每次读取一个字符,code表示这个字符的二进制编码
  *  @作者:褚永也
  *  @日期:2014-7-16 下午3:43:46
  *  @返回值类型:void
  */
 public static void read1(File file){
  try {
   FileReader fr = new FileReader(file);
   int code=0;//字符的二进制编码
   while((code=fr.read())!=-1){
    System.out.println(code+"  "+(char)code);
   }
  } catch (Exception e) {
   e.printStackTrace();
  } 
 }
 /**
  *
  *  @方法的作用:每次读取一个字符数组,len表示此数组的长度
  *  @作者:褚永也
  *  @日期:2014-7-16 下午4:06:29
  *  @返回值类型:void
  */
 public static void read2(File file){
  try {
   FileReader fr = new FileReader(file);
   char[] ch=new char[6];//每次读6个
   int len=0;//每次循环的元素个数
   while((len=fr.read(ch))!=-1){
    System.out.println(String.valueOf(ch,0,len));//转化成数组
   }
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } 
 }
 /**
  *
  *  @方法的作用:每次写入一个字符
  *  @作者:褚永也
  *  @日期:2014-7-16 下午4:20:11
  *  @返回值类型:void
  */
 public static void write1(File file){
  try {
   FileWriter fw = new FileWriter(file,true);
   String content="dsfdsfds第三方可敬的酸辣粉静安寺看到了伐sssss放大法";
   for(char c:content.toCharArray()){    
    fw.write(c);
    System.out.println(c); 
   }
   
   fw.flush();//注意要刷新,才能显示刚才写入的内容
   fw.close();
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
 }
 /**
  *
  *  @方法的作用:写入一个字符数组
  *  @作者:褚永也
  *  @日期:2014-7-16 下午4:31:08
  *  @返回值类型:void
  */
 public static void write2(File file){
  try {
   FileWriter fw = new FileWriter(file,true);
   String content="dsfdsfds第三方可敬的酸辣粉静安寺看到了伐sssss放大法";
   fw.write(content.toCharArray(), 10, 20);
   fw.flush();
   fw.close(); 
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
 }
}

 

第三:对象流的概念

对象流:是字节流(也是处理流),ObjectInputStream对象输入流,也是InputStream的子类。
要求对象保存到记事本中
ObjectInputStream依赖于Fileoutputstream,Fileoutputstream是在铺管道
序列化接口中没有任何方法,就是个标示接口
//对对象里的数据进行解码,可是对象里的数据没法解码,因为对象的编码没有规律。(对象以二进制的形式保存了)
注释:在把对象写入文件的时候,对象的内容出现了乱码,但是在读取这个对象的内容的时候就能正常的读取出来

 

第四:对象流相关代码

package com.objectStreamTest;

import java.io.Serializable;

public class User implements Serializable{
 private String username;
 private String userpass;
 public String getUsername() {
  return username;
 }
 public void setUsername(String username) {
  this.username = username;
 }
 public String getUserpass() {
  return userpass;
 }
 public void setUserpass(String userpass) {
  this.userpass = userpass;
 }
 public User() {
  super();
  // TODO Auto-generated constructor stub
 }
 public User(String username, String userpass) {
  super();
  this.username = username;
  this.userpass = userpass;
 }
 @Override
 public String toString() {
  return "User [username=" + username + ", userpass=" + userpass + "]";
 }
 

}

 

package com.objectStreamTest;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class ObjectStreamTest {

 /**
  *  @方法的作用:定义一个类,将该的对象进行序列化和反序列化操作
  *  @作者:褚永也
  *  @日期:2014-7-16 下午8:59:18
  *  @返回值类型:void
  */
 public static void main(String[] args) {
  File file = new File("src/com/objectStreamTest/test.txt");
  //对象序列化
  try { 
       FileOutputStream out=new FileOutputStream(file);
       ObjectOutputStream oos=new ObjectOutputStream(out);
       User u=new User("dddd","11111");
       oos.writeObject(u);
   
  } catch (Exception e) {
   e.printStackTrace();
  }
 
 
    //对象反序列化
     try {
      FileInputStream in=new FileInputStream(file);
    ObjectInputStream ois=new ObjectInputStream(in);
    Object obj = ois.readObject();
    if(obj instanceof User){
     User user=(User)obj;
     System.out.println(user.toString());
    }
  } catch (Exception e) {
   e.printStackTrace();
  }
 
 } 
}

 

 

第五:用Properties模拟用户登录

package com.login;

import java.io.FileInputStream;

import java.util.Properties;
import java.util.Scanner;

public class Login {
 /**
  *
  *  @方法的作用:用Properties文件保存用户和密码,模拟登陆功能,用键盘输入的用户和密码
                                                    和Properties文件保存用户和密码封装的用户和密码比较
  *  @作者:褚永也
  *  @日期:2014-7-16 下午9:23:36
  *  @返回值类型:void
  */
 public static void main(String[] args) {
  Properties p = new Properties();
  try {
   p.load(new FileInputStream("src/com/login/test.properties"));//提前在test.properties里写好东西。把这个文件加载一下就获得了文件里的东西
   //System.out.println(p.getProperty("username"));
  } catch (Exception e) {
   e.printStackTrace();
  }
  
  Scanner input = new Scanner(System.in);
  System.out.println("请输入用户名:");
  String username = input.next();
  if(p.getProperty("username").equals(username)){
   System.out.println("请输入密码");
   String userpass = input.next();
   if(p.getProperty("userpass").equals(userpass)){
    System.out.println("登陆成功");
   }else{
    System.out.println("登陆失败,密码有误");
   }
  }else{
   System.out.println("登陆失败,用户名有误");
  }
 }


}

test.properties里面的东西是:

username=张三

userpass=1234

 

第五:字节流的输入流与输出流

package com.byteTest;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class FileInputOutputStreamTest {

 /**
  *  @方法的作用:测试文件字节输入输出流
  *  @作者:褚永也
  *  @日期:2014-7-16 下午2:10:29
  *  @返回值类型:void
  */
 public static void main(String[] args) {
  File file = new File("F:\\test\\sub/a.txt");
  input1(file);
  input2(file);
  System.out.println("----------");
  output1(file);
  output2(file);
 }
 
 
 /**
  *
  *  @方法的作用:文件输出流,每次向文件中写入一个字节。
  *  @作者:褚永也
  *  @日期:2014-7-16 下午3:22:50
  *  @返回值类型:void
  */
 public static void output1(File file){
  try {
   FileOutputStream fos = new  FileOutputStream(file,true);
   String content="abcdefghijklmnopqrstuvwxyz";
   byte[] bt=content.getBytes();//先将字符串转化成字节数组在输入到文件中
   for(byte b:bt){
    System.out.println(b);
    fos.write(b);
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
 
 
 /**
  *
  *  @方法的作用:字节输出流,向文件中写入一个字节数组。
  *  @作者:褚永也
  *  @日期:2014-7-16 下午3:24:31
  *  @返回值类型:void
  */
 public static void output2(File file){
  try {
   FileOutputStream fos = new  FileOutputStream(file,true);
   String content="abcdefghijklmnopqrstuvwxyz";
   byte[] bt=content.getBytes();//先将字符串转化成字节数组
   //fos.write(bt, 0, content.length());
   fos.write(bt, 1, bt.length-4);//写入的时候可以截取这个字节数组
   System.out.println(bt);
  } catch (Exception e) {
   e.printStackTrace();
  }
  
 }
 
 
 /**
  *
  *  @方法的作用:每次读取一个字节,用的是FileInputStream类中的read方法,无参
  *  @作者:褚永也
  *  @日期:2014-7-16 下午2:48:12
  *  @返回值类型:void
  */
 public static void input1(File file){
  try {
   FileInputStream fis = new FileInputStream(file);
   int b=0;
   while((b=fis.read())!=-1){//fis.read()这里的返回值b表示的是每个字节的二进制编码
    System.out.println(b);//打印二进制编码
    System.out.println((char)b);//把二进制编码转化成char字符类型然后输出具体内容
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
  
  
 }
 
 
 
 /**
  *
  *  @方法的作用:每次读取一个字节数组,用的是FileInputStream类中的read(byte[] b)方法,带参
  *           
  *  @作者:褚永也
  *  @日期:2014-7-16 下午3:02:56
  *  @返回值类型:void
  */
 public static void input2(File file){
  try {
   FileInputStream fis = new FileInputStream(file);
   byte[] b=new byte[9];//给每次循环定义大小。每次读9个字节
   int len=0;
   while((len=fis.read(b))!=-1){ //fis.read(b)这里的返回值len表示本次循环的这个数组中的元素个数
    //fis.read(b);这句话不用写,因为写在了len=fis.read(b)中了
    String str=new String(b,0,len);
    System.out.println(str);
    
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

}

第六:图片处理:

1.

package com.image;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class ImageTest {
 /**
  *
  *  @方法的作用:用字节流将一张图片由d盘拷贝到e盘
  *  @作者:褚永也
  *  @日期:2014-7-16 下午8:17:38
  *  @返回值类型:void
  */
 public static void main(String[] args) {
        FileInputStream fis = null; 
        FileOutputStream fos = null; 
        File file=new File("f:\\login_bg.jpg");
         try {
           fis = new FileInputStream(file); 
           fos = new FileOutputStream("D:\\"+file.getName()); 
                  
                 byte[] buf = new byte[1024]; 
                  
                 int len = 0; 
                 while((len  = fis.read(buf))!=-1) 
                 { 
                     fos.write(buf, 0, len); 
                 } 
                  
             }  
         catch (Exception e) {  
             e.printStackTrace(); 
             }     
         finally 
         { 
             try  
             { 
                 if(fis!=null) 
                 fis.close(); 
             } catch (Exception e) {   
                 e.printStackTrace(); 
             } 
             try  
             { 
                 if(fos!=null) 
                 fos.close(); 
             }  
             catch (Exception e) {   
                 e.printStackTrace(); 
             } 
         } 
          
 }}

 

 

2.

package com.image;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;


public class TxtTest1 {

 /**
  *  @方法的作用:用字节流将一张图片由d盘拷贝到e盘... 用字节流将一个记事本由e盘拷贝到d盘
  *  @作者:褚永也
  *  @日期:2014-7-16 下午7:03:57
  *  @返回值类型:void
  */
 public static void main(String[] args) {
  //1.对文本中的内容的拷贝
  /*File file1=new File("F:\\test1\\a.txt");
  File file2=new File("F:\\test1\\b.txt");*/
    //2.对图片的拷贝
  /*File file1=new File("f:\\login_bg.jpg");//原图片
  File file2=new File("D:\\2.jpg");//拷贝到这个目录下,名字改成2.jpg*/  
   //3.对记事本的拷贝
  /*File file1=new File("f:\\a.jnt");//原图片
  File file2=new File("D:\\b.jnt");//拷贝到这个目录下,名字改成2.jpg*/
  //4.对歌曲的拷贝
  File file1=new File("f:\\tank.mp3");
        File file2=new File("D:\\b.mp3");
  try {
   FileInputStream fis = new FileInputStream(file1);
   FileOutputStream fos =new  FileOutputStream(file2);                                          
   byte[] b=new byte[1024];
   int len=0;
   while((len=fis.read(b))!=-1){  
    /*String str=new String(b,0,len);
    byte[] bt=str.getBytes();
    fos.write(bt, 0, bt.length);*/
    //上面三句跟这一句一样
    fos.write(b, 0, len);
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
  
 }
}

分享到:
评论

相关推荐

    IO流学习(字节流 字符流 文本流)!

    **对象流**如ObjectInputStream和ObjectOutputStream则用于序列化和反序列化Java对象,实现对象的持久化存储。 在实际编程中,我们还需要理解**异常处理**在IO流中的重要性。由于IO操作可能失败,如文件不存在、...

    java对象序列化和反序列化

    - 使用`ObjectInputStream`的`readObject()`方法读取序列化的字节流,会根据字节流中的信息创建和初始化对象。 3. **潜在问题**: - 安全风险:恶意构造的序列化数据可能导致代码执行,因此在反序列化时要确保...

    IO流与序列化

    序列化的主要应用场景有:持久化对象、网络传输和多线程之间的通信。通过序列化,可以将对象转换为字节序列,然后写入磁盘或在网络上传输;反序列化则是将字节序列恢复为原来的对象。 在文章《Java IO流与序列化...

    io_输入输出流_序列化反序列化_04.zip

    在Java中,序列化是将对象的状态转换为字节流的过程,以便可以存储到磁盘、在网络上传输或持久化到数据库中。要实现一个对象的序列化,该对象的类需要实现java.io.Serializable接口。序列化的主要方法是...

    关于 Java 对象序列化您不知道的 5 件事

    Java对象序列化不仅用于持久化对象状态,还能在网络传输中扮演关键角色,例如在RMI(远程方法调用)中。此外,它还可以作为缓存和备份数据的一种手段。通过实现`java.io.Serializable`接口,一个类的实例就能被序列...

    C#对象三种形式的序列化和反序列化

    在描述中提到,`Student`对象包含了图片,这种情况下二进制序列化可以高效地处理图像数据,因为它是原始字节流。 2. **SOAP序列化(SOAP Serialization)** SOAP序列化将对象转换为符合SOAP标准的XML消息,适合于...

    流程控制 网络编程 对象序列化

    通过序列化,可以将对象转化为字节流,然后通过网络发送。接收方再通过反序列化,将字节流还原成对象。 **2.3 Socket编程** Socket编程是网络编程的核心,通过创建Socket连接,可以在客户端与服务器间建立双向通信...

    Android-Android上的Java对象反序列化

    2. **反序列化**: 反序列化是序列化的逆过程,即将字节流还原为原来的Java对象。这个过程通常由`ObjectInputStream`类来完成,它读取字节流并根据类的信息重建对象。 二、Android中的反序列化 在Android环境中,...

    对象-序列化-反序列化相关资料

    序列化是指将一个对象的状态转换为可存储或可传输的形式,通常是字节流或者字符串。这个过程允许我们将程序中的复杂对象结构保存下来,以便于在后续的程序运行中恢复。序列化的应用场景广泛,例如,当应用程序需要...

    Java对象的序列化与反序列化Java开发Java经验技巧

    Java对象的序列化与反序列化是Java编程中一项重要的技术,它允许我们将Java对象转换为字节流,便于存储、传输或者在网络间传递。这一过程对于数据持久化、跨进程通信(如RMI,Remote Method Invocation)以及分布式...

    NET 中的对象序列化

    .NET中的对象序列化是将一个对象的状态转换成可存储或传输的形式的过程,主要目标是持久化对象的状态,以便后续能够重建完全相同的副本,或者按值将对象从一个应用程序域传递到另一个应用程序域。序列化在许多场景下...

    C#和Java的序列化反序列化

    这个过程通常将内存中的对象转换成字节流,以便保存到磁盘、数据库或者通过网络进行传输。在C#中,我们可以使用.NET框架提供的`System.Runtime.Serialization.Formatters.Binary.BinaryFormatter`类来进行二进制序列...

    Java对象序列化详细解析.doc

    Java对象序列化是一种将Java对象转换为字节流的过程,以便于存储、传输或在网络间进行通信。这一过程使得对象的状态能够被持久化,即使在程序关闭后也能重新恢复。在Java中,对象序列化是通过实现`java.io....

    Android 序列化对象存储到sharepreference

    当一个对象实现了Serializable接口,Java的默认序列化机制就可以将其转换为字节流,以便保存或在网络上传输。序列化的主要步骤包括: 1. 实现Serializable接口:在类定义中添加`implements Serializable`。 2. 创建...

    序列化和反序列化(文本加密成二进制文件)

    在IT领域,序列化和反序列化是两个关键概念,主要应用于数据持久化、网络通信以及对象存储等场景。序列化是指将一个对象的状态转换为可存储或传输的形式,通常是二进制流;反序列化则相反,是将这个二进制流恢复为...

    java自动序列化

    Java自动序列化是一种在Java编程语言中用于持久化对象的技术,它允许我们将对象的状态转换为字节流,以便可以存储或在网络上传输。这在分布式应用程序、数据存储和跨网络进程通信中非常常见。本篇文章将深入探讨Java...

    Java序列化对象工具类 Eclipse工程(SerializUtil.zip)

    在实际开发中,特别是在需要持久化对象或者在网络间传递对象的场景下,`SerializUtil`这样的工具类是非常实用的。然而,需要注意的是,序列化可能导致安全问题,例如序列化后的对象可能会被恶意用户利用,因此在设计...

    Java实验7 序列化.doc

    Java序列化是将Java对象转换为字节流的过程,以便可以存储在磁盘上或通过网络进行传输。这个过程对于持久化对象数据、跨进程通信和在网络上传输对象非常有用。在Java中,序列化是通过实现`Serializable`接口来完成的...

Global site tag (gtag.js) - Google Analytics