案例 1-1: InputStream 的用法

本文介绍了一个简单的Java程序示例,演示了如何使用InputStream从指定文件读取内容并将其输出到控制台。该程序利用FileInputStream进行文件读取操作,并通过循环确保所有数据都被正确读取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/* * 案例 1-1: InputStream 的用法 * 目标: 掌握 InputStream 的用法 * 读取指定文件的内容,并将其原样输出至屏幕上 * 使用方法:java ReadFile [文件名] */ import java.io.*; public class ReadFile { /** * @param args */ public static void main(String[] args) { // 定义一个 byte数组 用于接收从文件中读出的字节 // 注意它的长度为 1024 byte[] buff = new byte[1024];// 1 int n; FileInputStream fis = null; // 生成对象 infile 准备读取文件 try{ fis = new FileInputStream(args[0]);//2 // 从文件读取数据 while((n = fis.read(buff)) != -1)//3 { // 写入System.out System.out.write(buff, 0, n); } }catch(IOException e) { System.out.println(); } // 清理 finally{ try{ // 关闭 FileInputStream 流 fis.close(); }catch(IOException e){ System.out.println("文件错误"); System.exit(1); } } } } /* * 这个类从控制台接收一个参数,用于指定在程序中打开的文件, * 在//2处 使用它来创建一个FileInputStream对象 * 在//3处 通过它的方法read()将文件内容读入到//1处定义的字节数组中,然后使用System.out的一个 * 方法write()将字节数组中的数据输出到控制台.注意这里的字节数组大小为1024,所以,在指定读取的 * 文件时不要指定太大的文件. */
### 使用Java多线程同步方法实现车站售票 为了确保三个窗口能够安全地出售100张车票而不会发生超卖的情况,可以采用`Synchronized`关键字来控制多个线程对共享资源的操作。下面是一个简单的例子: ```java public class TicketOffice implements Runnable { private final Object lock; private int tickets; public TicketOffice(int ticketCount) { this.lock = new Object(); this.tickets = ticketCount; } @Override public void run() { while (true) { synchronized (lock) { if (tickets > 0) { try { Thread.sleep(10); } catch (InterruptedException e) {} System.out.println(Thread.currentThread().getName() + " sold a ticket. Remaining: " + (--tickets)); } else { break; } } } } } ``` 在这个案例里,通过`synchronized(lock)`语句块确保同一时间只有一个线程能访问临界区内的代码逻辑,即卖出一张票的动作[^1]。 接着,在主函数中创建三个代表不同售票窗口的线程,并启动它们: ```java public class Main { public static void main(String[] args) throws InterruptedException { TicketOffice to = new TicketOffice(100); Thread window1 = new Thread(to, "Window-1"); Thread window2 = new Thread(to, "Window-2"); Thread window3 = new Thread(to, "Window-3"); window1.start(); window2.start(); window3.start(); window1.join(); window2.join(); window3.join(); System.out.println("All tickets have been sold."); } } ``` 这段代码展示了如何利用Java多线程机制配合锁机制完成并发条件下的资源共享问题处理。 --- ### Java TCP编程实现文件上传至服务器 对于TCP协议下基于客户端-服务器架构的文件传输功能开发而言,通常的做法是在客户端发起连接请求并将待发送的数据打包成字节数组形式经由套接字(Socket)传递给接收方;而在服务端则监听特定端口等待来自任意地址的新链接建立尝试,一旦确认身份合法便着手解析收到的信息包并保存为本地文件。 以下是简化版的服务端与客户端之间的交互流程展示: #### 文件上传服务器端代码片段 ```java import java.io.*; import java.net.*; class FileUploadServer { public static void main(String argv[]) throws IOException { ServerSocket serverSocket = null; Socket clientSocket = null; FileOutputStream fos = null; BufferedOutputStream bos = null; InputStream is = null; try { // 绑定到指定端口 serverSocket = new ServerSocket(6667); while(true){ // 接受新的连接请求 clientSocket = serverSocket.accept(); // 获取输入流用于读取客户端发来的数据 is = clientSocket.getInputStream(); // 准备好输出流准备将接收到的内容写入磁盘 fos = new FileOutputStream("received_file.txt"); bos = new BufferedOutputStream(fos); byte buffer[] = new byte[4096]; int bytesRead; // 循环读取消息直到结束标志位到达 while ((bytesRead = is.read(buffer)) != -1 ) { bos.write(buffer, 0 , bytesRead ); } // 刷新缓冲区使所有未写出的数据立即被写出 bos.flush(); // 关闭各种IO流释放资源 bos.close(); fos.close(); is.close(); clientSocket.close(); } } finally{ if(serverSocket!=null && !serverSocket.isClosed()){ serverSocket.close(); } } } } ``` 此部分负责侦听网络接口上的活动,每当有新客户接入时就为其分配独立的工作线程去处理实际的数据交换事务[^2]。 #### 文件上传客户端代码片段 ```java import java.io.*; import java.net.*; class FileUploadClient { public static void main(String argv[]) throws UnknownHostException, IOException { Socket echoSocket = null; PrintWriter out = null; BufferedReader stdIn = null; FileInputStream fis = null; BufferedInputStream bis = null; try { // 连接到远程主机 echoSocket = new Socket("localhost", 6667); // 打开要传送的文件作为输入源 fis = new FileInputStream("source_file.txt"); bis = new BufferedInputStream(fis); // 构建输出流向远端机器发送消息 OutputStream os = echoSocket.getOutputStream(); BufferedOutputStream bos = new BufferedOutputStream(os); byte[] mybytearray = new byte[4096]; int bytesRead; // 开始逐批读取文件内容并通过socket发出 while((bytesRead=bis.read(mybytearray ))!=-1 ){ bos.write(mybytearray ,0 ,bytesRead ); } // 清空缓存确保全部资料已送出 bos.flush(); // 断开连接前先关闭各个组件防止内存泄漏 bos.close(); os.close(); bis.close(); fis.close(); echoSocket.close(); }finally{ if(echoSocket!=null&&!echoSocket.isClosed()) echoSocket.close(); } } } ``` 上述两段程序共同构成了一个完整的C/S模式下的文件上载解决方案框架。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值