『Java』IO--Properties-打印流-序列流基础

java.util

Properties是hashtable的子类, (集合中涉及到IO流的对象)

也就是说它具备map集合的特点,而且它里面存储的键值对都是字符串.

集合中和IO技术相结合的集合容器

该对象的特点,可以用于键值对形式的配置文件

在加载数据时,需要数据有固定格式:键=值(#开头的都是注释)

 

将一文件中的数据存储到Properties集合中.

思路:1,用一个流和文件关联

 2读取一行数据将改行数据用”=”进行切割

 3,等号左边作为键,右边作为值.存入到Properties集合中.

 

实例:

import java.io.*;

import java.util.*;

class PropertiesDemo{

public static void main(String[] args)throws IOException{

BufferedReader bure=new BufferedReader(new FileReader("Blog.txt"));

Properties pro=new Properties();

String line=null;

while((line=bure.readLine())!=null){

String[] str=line.split("=");//将字符串以=分开存放到数组

pro.setProperty(str[0],str[1]);

}

System.out.println(pro);

}

}

 

替代以上方法,上面方法的封装版:

第二个,参数为字符流的第而个load方法,是1.6版本开始的.

 

 

 

实例:

public static void main(String[] args)throws IOException{

Properties pro=new Properties();

FileReader fr=new FileReader("Blog.txt");

pro.load(fr);

System.out.println(pro);

}

 

 

一Properties集合中的数据,存储到指定文件中:

第二个,参数为字符流的第而个store方法,是1.6版本开始的.comments为注释.(支持英文)

 

 

 

实例:

class PropertiesDemo{

public static void main(String[] args)throws IOException{

Properties pro=new Properties();

FileWriter fr=new FileWriter("Blog.txt");

pro.setProperty("颜色","红色");

pro.store(fr,"hiahia");

System.out.println(pro);

}

}

 

 

 

练习:

/*需求:编写一个用于记录应用程序运行次数的程序.

如果使用次数达到规定次数,那么就发出注册提示

*/下面是毕老师的分析:

 

实例代码:
class PropertiesDemo{
public static void main(String[] args)throws IOException{
	Properties prop=new Properties();//建立properti集合,存储数据对
	File file=new File("blog.txt");//用File封装日志文件
	if(!file.exists())//判断日志文件是否存在,不存在就创建一个
				file.createNewFile();
	FileInputStream fis=new FileInputStream(file);//建立输入流,把日志文件数据读取到流中
	prop.load(fis);//将流中的日志文件数据读取到properties集合中.
	
	int count=0;//定义计数器
	String value=prop.getProperty("lock");//获取lock键值
	
	if(value!=null){//判断该键是否为空
		count=Integer.parseInt(value);//不为空,就将该值转为int类型.赋给计数器.
		if(count>=5)//判断该值是否超过次数
		{
			System.out.println("您的次数已到,请注册");//超出后,发出警告.
			return;
		}
	}
	//如果,value不为空,证明,该软件第一次启动,就将计数器0+1,先存储到Properties集合中.
	count++;
	prop.setProperty("lock",count+"");
	//建立输出流,指定好文件
	FileOutputStream fos=new FileOutputStream(file);
	//调用,store方法,将properties中的数据赋到制定日志文件.永久保存.....
	prop.store(fos,"");
	fos.close();
	fis.close();
		
	}
}

打印流,可以直接操作输入流和文件
字符PrintWriter打印流很吊的对象一般和文件有联系的都很吊

 

该流提供了打印方法,可以将各种数据类型的数据都原样打印

 

字节打印流: PrintStream

构造函数可以接受的参数类型:

1,file对象File

2,字符串路径String

3,字节输出流OutputStream

字符打印流:

PrintWriter

构造函数可以接受的类型:

1,file对象File

2,字符串路径String

3,字节输出流OutputStream

5,字符输出流Writer

很给里的构造方法………(OutputStream out,boolean autoFlush)

 

即要望文件中高数据又想自动刷新,,,,直接把文件封装到流中就搞定………..

 

PrintWriter out =new PrintWriter(new FileWriter(“a.txt”),true)

 

java.io 
类 序列流SequenceInputStream

public class SequenceInputStream  extends InputStream

对多个流进行合并

 

 

 

SequenceInputStream [数][计] 序列表示其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。 

 

 

 

实例:

SequenceInputStream[序列](Enumeration<? extends InputStream> e)

想汇总更多流需要,涉及到Enumeration枚举.只有Vector中有………

 

 

 

Vector是线程同步的效率不怎么高,看看换成ArrayList是如何,最后用上枚举的:

 

 

 

关掉总流,其他三个小流也就随之关掉……

 

 

切割文件

 

 

 

切txt文件

public static void main(String[] args)throws IOException{

FileWriter fw=new FileWriter("Test.txt");

fw.write("你好啊我好啊他好啊");

fw.close();

//建立一个字节流,将文件输入到流中操作

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

FileOutputStream fos=null;

byte[] by=new byte[6];//规定三个文字分成一个txt文件...

int i=0;

int count=1;//计数器....

while((i=fis.read(by))!=-1){

fos=new FileOutputStream((count++)+"split.txt");

fos.write(by,0,i);

fos.close();

}

fis.close();

}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个错误提示是因为在序列化过程中,没有找到适合的序列化器来处理Java中的ByteArrayInputStream类。同时,也没有发现可以创建BeanSerializer的属性。 解决这个问题的方法是,你需要自定义一个序列化器来处理ByteArrayInputStream类。你可以实现Java的Serializable接口,并在其中定义自己的序列化和反序列化方法。然后,将这个自定义的序列化器注册到你的应用程序中,以便在序列化过程中使用它。 另外,你也可以考虑使用其他的序列化方式,例如JSON或XML序列化,这些方式可能更适合你的应用程序。 ### 回答2: 这个错误是由于 Jackson 没有找到可以序列化的 Java 对象或属性,导致无法创建相应的序列化器所引起的。在这里,错误是由于一个名为 java.io.ByteArrayInputStream 的 Java 类对象没有被 Jackson 序列化器找到。 ByteArrayInputStream 是一个字节数组输入,它允许将字节数组作为输入去读取。但是,由于它不是一个 JavaBean(Plain Old Java Object),并且没有可序列化的属性,所以它不支持默认的 Java 序列化和反序列化。 为了解决这个问题,我们需要手动为 java.io.ByteArrayInputStream 类创建一个自定义的序列化器和反序列化器,以便 Jackson 能够正确地将其序列化为 JSON 游离状态,同时反序列化也变得正常。 或者,如果只是想简单地将字节数组转换为字符串,可以考虑使用标准库中的 String 类构造函数: String(byte[] bytes, Charset charset)。 这样可以很容易地将字节数组转换为字符串,而无需使用 Jackson 进行额外的处理。 总之,这个错误的解决方法是要找到原因,确定导致错误的 Java 类对象,并为其创建自定义的序列化和反序列化器,以便 Jackson 能够正确地将其序列化为 JSON 游离状态。 ### 回答3: 这是一个关于在Java序列化和反序列化过程中的异常问题。当我们需要将一个Java对象序列化为字节,或将一个字节序列化为Java对象时,需要使用对象的序列化器。但如果这个对象的类没有实现Serializable接口,或者在反序列化过程中找不到对应的bean序列化器,就会出现这个异常。 具体而言,如果一个类没有实现Serializable接口,则不能将其序列化为字节。而在反序列化过程中,如果没有找到对应的bean序列化器,则无法将字节序列化为相应的Java对象。这种情况可能出现的原因是:在序列化对象时使用了一个不支持序列化的对象;或者在反序列化对象时,类路径设置不正确或者类的版本不一致。 解决这个问题可以尝试以下几种方法: 1. 确保对象实现了Serializable接口。 2. 对于反序列化过程中找不到bean序列化器的情况,可以通过在类路径中添加类所在的包或者将类添加到classpath中解决。 3. 对于版本不一致的情况,可以通过在类中添加serialVersionUID来解决。这个serialVersionUID是一个class文件的标识符,如果两个class文件的serialVersionUID不相同,则会认为版本不一致。 4. 如果以上方法都无法解决问题,可以尝试使用其他更为灵活的序列化库,如Kryo、Apache Avro等。 需要注意的是,序列化和反序列化过程中对类和对象的要求非常严格,因此我们需要仔细检查类的实现和使用方式,以避免出现这种异常。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值