0 0

java多线程读写同一个文件5

      同一个文件可以同时被一个线程读另一个线程写吗?

2013年3月06日 14:20

8个答案 按时间排序 按投票排序

0 0

采纳的答案

如果有一个线程正在读文件,这时又有另个一个线程想来写这个文件 会报错吗?
答案是不会。
请运行以下的代码 就知道了

package org.sse.test;

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

public class IO {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new IO().test();
	}

	private void test() {
		ReadThead rt = new ReadThead();
		Thread t1 = new Thread(rt, "ReadThead");
		WriteThead wt = new WriteThead();
		Thread t2 = new Thread(wt, "WriteThead");
		t1.start();
		t2.start();
	}

	protected class WriteThead implements Runnable {

		@Override
		public void run() {
			try {
				File f = new File("D:\\A.txt");
				FileOutputStream fos = new FileOutputStream(f);
				byte[] b = "hello".getBytes();
				while (true) {
					fos.write(b);
					fos.flush();
					Thread.sleep(1000);
				}
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}

		}

	}

	protected class ReadThead implements Runnable {

		@Override
		public void run() {
			try {
				File f = new File("D:\\A.txt");
				FileInputStream fis = new FileInputStream(f);
				int readData;
				while (true) {
					readData = fis.read();
					if (readData == -1) {
						Thread.sleep(1000);
					} else {
						System.out.println(readData);
					}
				}
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}

	}
}

2013年3月08日 10:35
0 0

同时读是没有任何问题的,直接读就可以了
至于同时写,因为有锁,不过要实现也是可以的
我的大体思想是这样的:比如有A和B两个线程,首先A把0-100的字节写进去,B开始读101-200的字节并存入一个缓存中,然后A退出开始读201-300之间的字节,B将缓存写入,如此循环就可以实现多线程读写了
本人的一点愚见,希望能帮到你

2013年3月07日 11:37
0 0

亲,这个问题google大把答案还有现成的代码哦。亲!

2013年3月06日 18:30
0 0

nio 就是非阻塞,读从来都没有加锁的啊

2013年3月06日 17:46
0 0

多个线程同时写都是可以的,你去看看java.nio.channels.FileChannel

2013年3月06日 17:32
0 0

写加锁 读不加锁的

2013年3月06日 14:46
0 0

本文提供java多线程分别定时读写同一个文件的样例,其中两个线程,一个每分钟写入当前时间到指定文件,另一个线程读出每分钟新写的内容。
使用简单的Thread.sleep技术实现定时
package test.thread;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Date;
/**
* 多线程读写同一个文件的样例。
*/
public class ThreadReadWrite {
  public static void main(String[] args) {
    new ThreadWrite().start();
    try {
      Thread.sleep(2000); // 休眠,以免那面还有写好
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    new ThreadRead().start();
  }
}
class ThreadWrite extends Thread {
  File file = new File("test.txt");
  @Override
  public void run() {
    try {
      while (true) {
        FileWriter out = new FileWriter(file, true);// 追加写入
        out.write(new Date() + "/n");
        out.flush();
        out.close();
        Thread.sleep(3000); // 我这里间隔改成3秒,方便测试
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
class ThreadRead extends Thread {
  File file = new File("test.txt");
  @Override
  public void run() {
    try {
      BufferedReader reader = new BufferedReader(new FileReader(file));
      while (true) {
        System.out.println(reader.readLine());
        Thread.sleep(3000); // 我这里间隔改成3秒,方便测试
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

如果真的要求严格,应该用Timer继续比较精确的控制。
package test.thread;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
/**
* 使用Timer定时器进行同一文件的读写。
*/
public class ThreadReadWriteTimer {
  static File file = new File("test.txt");
  public static void main(String[] args) {
    Timer timer = new Timer();
    timer.scheduleAtFixedRate(new TimerTask() {
      @Override
      public void run() {
        FileWriter out;
        try {
          out = new FileWriter(file, true);
          // 追加写入
          out.write(new Date() + "/n");
          out.flush();
          out.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }, 0, 3000);
    timer.scheduleAtFixedRate(new TimerTask() {
      BufferedReader reader = null;
      {
        try {
          reader = new BufferedReader(new FileReader(file));
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
      @Override
      public void run() {
        try {
          System.out.println(reader.readLine());
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }, 1000, 3000);
  }
}

2013年3月06日 14:24
0 0

好像 可以吧

2013年3月06日 14:23

相关推荐

    java多线程读取文件

    Java多线程读大文件 java多线程写文件:多线程往队列中写入数据

    多线程对文件读写操作(java)

    在Java编程中,多线程技术是提升程序执行效率的关键之一,特别是在进行文件读写操作时。本主题将深入探讨如何使用多线程来优化文件的读取和写入过程,以及需要注意的相关问题。 首先,我们需要理解单线程与多线程在...

    java多线程读写文件示例

    Java多线程读写文件示例 Java多线程读写文件示例是指在Java编程语言中使用多线程技术来实现文件的读写操作。该示例主要介绍了如何使用Java多线程技术来实现文件的读写操作,包括文件的写入、读取和同步控制等。 ...

    java多线程有序读取同一个文件

    Java多线程有序读取同一个文件的实现 Java多线程有序读取同一个文件是指在多个线程中读取同一个文件的内容,并且保证读取的顺序。这种技术在实际应用中非常有用,例如在大数据处理、分布式系统、云计算等领域都有...

    java多线程文件传输

    Java多线程文件传输是Java编程中一个重要的实践领域,特别是在大数据处理、网络通信和分布式系统中。在Java中,多线程可以提高程序的执行效率,尤其在处理并发任务时,如大文件的上传、下载和传输。下面将详细探讨...

    多线程通信读写文件

    特别是在处理大量数据时,如读写文件,多线程可以同时执行不同的任务,从而显著提高整体性能。本项目着重探讨如何在多线程环境中实现安全有效的文件读写操作。 首先,我们需要理解多线程的基本概念。在单核处理器...

    java多线程加队列上传文件_后台处理

    ### Java多线程加队列上传文件_后台处理 #### 概述 本文将详细介绍一个基于Java实现的多线程文件上传系统,并结合队列管理技术来优化后台处理流程。该系统通过创建多个线程来并行处理客户端的文件上传请求,同时...

    java实现多线程文件传输

    在Java编程语言中,实现多线程文件传输是一种优化程序性能、提高系统资源...在提供的`java多线程文件传输`压缩包中,可能包含了实现这些概念的示例代码,通过分析和学习,可以更好地理解多线程文件传输的原理和实践。

    Java多线程文件下载

    Java多线程文件下载是一种高效的下载策略,它通过将大文件分割成多个部分,然后创建多个线程分别下载这些部分,来实现并行下载。这种技术可以显著提高下载速度,尤其是在网络条件不稳定或者带宽有限的情况下。下面...

    一个多线程同步读写的小程序

    特别是在处理I/O密集型任务(如读写文件)时,多线程可以显著提升性能。在这个“一个多线程同步读写的小程序”中,我们看到开发者尝试通过创建读线程和写线程来同时进行数据的读取和写入,以优化程序的执行流程。 ...

    Java多线程文件分片下载实现的示例代码

    Java多线程文件分片下载实现的示例代码 本文将详细介绍Java多线程文件分片下载的实现示例代码,通过示例代码,大家可以学习和理解多线程文件分片下载的技术难点和解决方案。 多线程下载的技术难点 ---------------...

    java多线程进度条

    本主题将深入探讨如何在Java多线程环境下实现进度条功能。 首先,理解Java多线程的基本概念至关重要。Java通过Thread类和Runnable接口来支持多线程。创建一个新线程通常有两种方式:继承Thread类并重写run()方法,...

    多线程全面遍历磁盘文件

    在IT领域,多线程遍历磁盘文件是一项常见的任务,尤其在大数据处理、文件管理系统以及备份恢复等场景中。本文将深入探讨如何利用多线程技术高效地遍历包括隐藏文件和系统文件在内的所有磁盘文件。 首先,我们要理解...

    多线程读取文件

    本文将围绕“多线程读取文件”这一主题,结合给定的标签“源码”和“工具”,深入探讨如何在Java等编程语言中实现这一功能,并提供一些实用的工具和技巧。 首先,我们了解为什么需要多线程读取文件。当处理大型文件...

    java socket通讯例程 多线程读写 可以同时收发不同终端的消息

    在主线程中通过控制台读取键盘...服务器在收到一个socket连接之后,把该socket保存到队列中,并对队列中的每个socket开启各自的读写线程。测试可以在不同控制台运行server和client,服务器接收消息时,会显示消息来源

    java实现多线程下载文件

    在Java编程中,多线程下载文件是一种优化大文件下载速度和效率的技术。它通过将一个大文件分割成多个小部分,然后同时启动多个线程分别下载这些部分,从而达到加速下载的效果。以下是对这个主题的详细解释: 1. **...

    java多线程网络传输文件(非同步)

    ### Java多线程网络传输文件(非同步) #### 概述 在现代软件开发中,尤其是在涉及大量数据传输的应用场景下,高效的文件传输方案尤为重要。Java作为一种广泛应用的编程语言,提供了丰富的工具和技术来实现高性能...

    java多线程断点下载

    Java多线程断点下载是网络编程中一个实用的技术,尤其在处理...总的来说,Java多线程断点下载是一个涉及并发编程、文件操作、异常处理等多个领域的综合实践。通过合理设计和优化,我们可以构建出高效且可靠的下载系统。

    WHUT-java多线程实验-第三周-文件上传和下载.zip

    总的来说,这个实验将教会你如何在Java多线程环境中实现高效、稳定的文件上传和下载功能,这是一项对任何开发人员来说都非常实用的技能,尤其是在构建高性能的Web应用或后台服务时。通过实践和理解这些概念,你将...

    Java实现文件的多线程下载

    在Java编程中,多线程是一项关键特性,它允许程序同时执行多个任务,极大地提高了效率。在本案例中,我们将探讨如何...在这个案例中,不仅学习了Java多线程编程,还涉及到网络I/O、文件操作以及并发控制等多个知识点。

Global site tag (gtag.js) - Google Analytics