IO流与多线程总结

IO流

1.概念

IO流用来处理设备之间的数据传输

Java对数据的操作是通过流的方式

Java用于操作流的类都在IO包中

流按流向分为两种:输入流,输出流。

流按操作类型分为两种:字节流与字符流。  字节流可以操作任何数据,字符流只能操作纯字符数据,比较方便。

2.IO流常用父类

字节流的抽象父类:

InputStream ,OutputStream

字符流的抽象父类:

Reader , Writer

3.IO程序书写

使用前,导入IO包中的类

使用时,进行IO异常处理

使用后,释放资源

字节流

1.读取文件

创建FileInputStream对象, 指定一个文件. 文件必须存在, 不存在则会抛出FileNotFoundException

使用read()方法可以从文件中读取一个字节. 如果读取到文件末尾会读到-1

读取结束后需要释放资源, 调用close()方法关闭输入流

2.写出文件

创建FileOutputStream对象, 指定一个文件. 文件不存在会创建新文件, 存在则清空原内容. 如果需要追加, 在构造函数中传入true.

使用write()方法可以向文件写出一个字节.

写出结束后同样需要调用close()

3.拷贝文件

可以从文件中逐个字节读取, 逐个字节写出, 但这样做效率非常低

我们可以定义一个数组作为缓冲区, 一次读取多个字节装入数组, 然后再一次性把数组中的字节写出1byte = 8bit

4.常用方法

InputStream:

read() 读取一个字节

read(byte[]) 读取若干(数组长度)字节

available() 获取可读的字节数

close() 关闭流, 释放资源

OutputStream:

write(int) 写出一个字节

write(byte[]) 写出数组中的所有字节

write(byte[],start,len);

close() 关闭流, 释放资源

5.BufferedInputStream

BufferedInputStream内置了一个缓冲区(数组)

从BufferedInputStream中读取一个字节时

BufferedInputStream会一次性从文件中读取8192个, 存在缓冲区中, 返回给程序一个

程序再次读取时, 就不用找文件了, 直接从缓冲区中获取

直到缓冲区中所有的都被使用过, 才重新从文件中读取8192个

6.BufferedOutputStream

BufferedOutputStream也内置了一个缓冲区(数组)

程序向流中写出字节时, 不会直接写到文件, 先写到缓冲区中

直到缓冲区写满, BufferedOutputStream才会把缓冲区中的数据一次性写到文件里

字符流

1.字符流是什么

字符流是可以直接读写字符的IO流

字节流只能读写字节. 如果要读取字符, 就要先读取到字节数据, 然后转为字符. 如果要写出字符, 需要把字符转为字节再写出.   

2.FileReader, FileWriter

FileReader类的read()方法可以按照字符大小读取

FileWriter类的write()方法可以自动把字符转为字节写出

3.什么情况下使用字符流

字符流也可以拷贝文本文件, 但不推荐使用. 因为读取时会把字节转为字符, 写出时还要把字符转回字节.

程序需要读取一段文本, 或者需要写出一段文本的时候可以使用字符流

4.带缓冲的字符流

BufferedReader的read()方法读取字符时会一次读取若干字符到缓冲区, 然后逐个返回给程序, 降低读取文件的次数, 提高效率

BufferedWriter的write()方法写出字符时会先写到缓冲区, 缓冲区写满时才会写到文件, 降低写文件的次数, 提高效率

BufferedReader的readLine()方法可以读取一行字符(不包含换行符号)

BufferedWriter的newLine()可以输出一个跨平台的换行符号

5.LineNumberReader

LineNumberReader是BufferedReader的子类, 具有相同的功能, 并且可以统计行号

调用getLineNumber()方法可以获取当前行号

调用setLineNumber()方法可以设置当前行号

6.使用指定的码表读取字符

FileReader是使用默认码表读取文件, 如果需要使用指定码表读取, 那么可以使用InputStreamReader

FileWriter是使用默认码表写出文件, 如果需要使用指定码表写出, 那么可以使用OutputStreamWriter

File

1.什么是File类

File类对象可以代表一个路径, 此路径可以是文件也可以是文件夹, 该类方法可以对这个路径进行各种操作

2.创建对象

给File类构造函数传一

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 多线程能够提高程序的并发处理能力,排除资源竞争问题,从而提高程序的效率。如果多线程的效率比单线程低,可以从以下几个方面进行改进: 1. 减少线程切换的开销:线程切换需要进行上下文的保存和恢复,如果线程切换过于频繁,会导致系统开销过大。可以通过线程池、协程等方式来减少线程的创建和销毁,从而降低线程切换的开销。 2. 优化线程调度算法:多线程的调度算法可以影响程序效率,一些不合理的算法会导致某些线程一直得不到执行,从而影响程序的响应速度。优化线程的调度算法可以减少资源竞争,提高程序的效率。 3. 合理使用锁:多线程访问共享数据时需要使用锁,但是锁的过度使用会影响程序的执行效率。可以通过减小锁的粒度、使用无锁数据结构等方式来避免锁的过度使用。 4. 并发编程模型的优化: 针对具体的应用,可以选择高效的并发编程模型,比如actor模型、数据编程模型、异步编程模型等,以提高程序的并发性和效率。 以上是一些简单的优化方法,具体的优化方式需要根据具体的应用场景和代码实现来进行选择。 ### 回答2: 多线程的效率比单线程低的原因通常是由于线程间的并发竞争资源导致的。为了改进多线程的效率,以下是一些详细的方法: 1. 减少锁的使用:在多线程情况下,锁是用来确保共享资源的安全的,但过多的锁使用会导致线程间竞争,从而降低效率。可以考虑通过使用更细粒度的锁、无锁数据结构、CAS操作(比如Atomic类)等方法来减少对锁的依赖。 2. 使用线程池:线程的创建和销毁是有一定开销的,如果频繁地创建和销毁线程,会导致额外的开销。使用线程池可以重复利用线程,减少创建和销毁的开销。 3. 分解任务:将大任务分解为多个小任务,每个任务由一个线程处理。通过任务的分解,可以减少线程间的竞争,提高并行处理的效率。 4. 优化资源竞争:通过减少线程间的资源竞争来提高效率。可以使用无锁数据结构、线程本地变量等方式来减少线程间的竞争。 5. 使用异步编程:通过使用异步编程模型,可以在等待IO操作或其他耗时操作时,释放线程并并行处理其他任务,提高整体的效率。 6. 并行计算:对于可以并行计算的任务,可以使用并行计算框架(如Java的Fork/Join框架)来实现并发处理,充分利用多核处理器的能力,提高效率。 总结来说,改进多线程的效率可以通过减少锁的使用、使用线程池、分解任务、优化资源竞争、异步编程和并行计算等方法来实现。这些方法可以减少线程间的竞争和等待时间,提高并行处理的效率。 ### 回答3: 多线程的效率比单线程低的主要原因是线程间的资源竞争和同步开销。为了改进多线程的效率问题,可以考虑以下几个方面的优化方法: 1. 减少线程间的竞争:避免多个线程同时访问相同的资源,可以通过资源分配和调度算法来减少线程间的竞争。例如,可以将任务按照不同的优先级进行分组,让高优先级的任务尽量优先执行,降低资源竞争的可能性。 2. 减少线程切换的次数:线程切换是影响多线程效率的重要因素,可以通过减少线程切换的次数来提高效率。例如,可以使用线程池来重用线程,避免频繁创建和销毁线程,减少切换开销。 3. 使用合适的同步机制:多线程中常遇到的一个问题是需要共享资源,为了保证数据的一致性,需要使用适当的同步机制,如锁、信号量等。但过多地使用同步机制会增加线程间的等待时间,降低效率。因此需要根据实际场景选择合适的同步机制,尽量减少对共享资源的争用。 4. 利用并行计算:多线程可以分配任务并行执行,提高计算效率。可以将一个大任务拆分成多个小任务,让多个线程并行执行,最终将结果合并,提高整体效率。 5. 优化算法和数据结构:在多线程环境下,选择合适的算法和数据结构也能提升效率。例如,使用无锁的数据结构,如ConcurrentHashMap,可以减少线程间的竞争,提高效率。 总结起来,改进多线程的效率可以从减少线程间竞争,减少线程切换次数,使用合适的同步机制,利用并行计算,优化算法和数据结构等方面入手。同时,也需要根据具体应用场景进行分析和调整,以达到更好的性能和效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值