为了比较beansdb,写了一个基于socket的java文件读取测试。
server:
import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.io.PushbackInputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.ScheduledThreadPoolExecutor; import org.apache.commons.io.FileUtils; import com.taobao.tlog.util.NamedThreadFactory; public class FileServer { public void run() throws IOException { bosses.submit(new Boss()); } static ExecutorService bosses = new ScheduledThreadPoolExecutor(1, new NamedThreadFactory("boss", false)); static ExecutorService workers = new ScheduledThreadPoolExecutor(1, new NamedThreadFactory("worker", false)); private static class Boss implements Callable { @Override public Object call() throws Exception { ServerSocket server = new ServerSocket(8080); while (true) { Socket socket = server.accept(); workers.submit(new Wroker(socket)); } } } private static class Wroker implements Callable { Socket socket; PushbackInputStream input; public Wroker(Socket socket) throws IOException { this.socket = socket; input = new PushbackInputStream(socket.getInputStream(), 1); } protected void receive(String path) throws IOException { File file = new File(path); byte[] data = FileUtils.readFileToByteArray(file); OutputStream output = socket.getOutputStream(); output.write(data); output.flush(); System.out.println(path+" flush"); } public void accept() throws Exception { int bytesToRead = 0; while (true) { bytesToRead = input.available(); if (bytesToRead > 0) { byte[] t = new byte[45]; input.read(t); String path = new String(t); // System.out.println("path=" + path); receive(path); } else { int b = input.read(); // 此操作会阻塞,直到有数据被读到 if (b < 0) { throw new IOException( " end of the socket input stream has been reached,may be server socket is closed!"); } else { input.unread(b); continue; } } } } @Override public Object call() { while (true) { try { accept(); } catch (Exception e) { e.printStackTrace(); System.exit(-1); } } } } public static void main(String[] args) throws IOException { new FileServer().run(); } }
client
import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PushbackInputStream; import java.net.InetSocketAddress; import java.net.Socket; import java.text.DecimalFormat; import java.util.Random; public class FileClient { static Random random = new Random(); Socket socket; PushbackInputStream input; public FileClient() throws IOException { init(); } public void init() throws IOException { socket = new Socket(); socket.setReuseAddress(true); socket.setKeepAlive(true); socket.setTcpNoDelay(true); socket.setSoLinger(true, 0); socket.setSoTimeout(60000); socket.connect(new InetSocketAddress("localhost", 8080), 60000); input = new PushbackInputStream(socket.getInputStream(), 1); } public void send(String path) throws IOException { // System.out.println(path); OutputStream out = socket.getOutputStream(); OutputStreamWriter writer = new OutputStreamWriter(out); writer.write(path); writer.flush(); } /** * System.out.println("readed:" + readBytes + ",bytesToRead:" + bytesToRead); * <pre> * readed:-1,bytesToRead:0 * readed:-1,bytesToRead:180224 * readed:131072,bytesToRead:376831 * readed:262144,bytesToRead:344063 * readed:393216,bytesToRead:324300 * readed:524288,bytesToRead:193228 * readed:655360,bytesToRead:62156 * readed:717516,bytesToRead:0 * </pre> * @throws IOException */ public void readLine() throws IOException { int bytesToRead = 0; int readBytes = -1; while (true) { bytesToRead = input.available(); if (readBytes >= 717516) { break; } if (bytesToRead > 0) { byte[] data = new byte[bytesToRead]; readBytes += input.read(data); } else { int b = input.read(); // 此操作会阻塞,直到有数据被读到 if (b < 0) { throw new IOException( " end of the socket input stream has been reached,may be server socket is closed!"); } else { input.unread(b); continue; } } } } public void test() throws IOException { DecimalFormat df = new DecimalFormat("#00"); long begin = System.currentTimeMillis(); for (int i = 0; i < 100; i++) { int id = random.nextInt(10000); int month = id % 12 + 1; int day = id % 30 + 1; int ix = id % 99 + 1; String file = "/duitang/data/pic_test/2013/" + df.format(month) + "/" + df.format(day) + "/HDFS" + df.format(ix) + ".jpeg"; send(file); readLine(); } long end = System.currentTimeMillis(); System.out.println((end - begin) + "ms "); } public static void main(String[] args) throws IOException { FileClient client = new FileClient(); for (int i = 0; i < 10; ++i) { client.test(); } } }
测试数据准备,测试数据按照/year/month/day/data 存放,一共36000张图片:
import java.io.File; import java.io.IOException; import java.text.DecimalFormat; import org.apache.commons.io.FileUtils; public class FileUtil { public static void buildData() throws IOException { DecimalFormat format = new DecimalFormat("#00"); String path = "/duitang/data/pic_test/2013"; for (int month = 1; month < 13; ++month) { File mongthPath = new File(path, format.format(month)); mongthPath.mkdirs(); for (int day = 1; day < 31; ++day) { File dayPath = new File(mongthPath, format.format(day)); dayPath.mkdirs(); for (int i = 1; i < 100; ++i) { FileUtils.copyFile(new File("/tmp/HDFS.jpeg"), new File(dayPath, "HDFS" + format.format(i) + ".jpeg")); } } } } }
在我笔记本上的性能:
187ms 174ms 157ms 169ms 171ms 154ms 168ms 155ms 163ms 164ms
产生的图片请求,确保是随机的:
/duitang/data/pic_test/2013/03/27/HDFS48.jpeg flush /duitang/data/pic_test/2013/09/09/HDFS39.jpeg flush /duitang/data/pic_test/2013/02/08/HDFS74.jpeg flush /duitang/data/pic_test/2013/06/12/HDFS87.jpeg flush /duitang/data/pic_test/2013/08/08/HDFS50.jpeg flush /duitang/data/pic_test/2013/01/07/HDFS79.jpeg flush /duitang/data/pic_test/2013/10/16/HDFS52.jpeg flush /duitang/data/pic_test/2013/02/08/HDFS47.jpeg flush /duitang/data/pic_test/2013/07/19/HDFS88.jpeg flush /duitang/data/pic_test/2013/05/29/HDFS14.jpeg flush /duitang/data/pic_test/2013/08/20/HDFS71.jpeg flush /duitang/data/pic_test/2013/08/20/HDFS26.jpeg flush /duitang/data/pic_test/2013/03/09/HDFS45.jpeg flush /duitang/data/pic_test/2013/03/15/HDFS36.jpeg flush /duitang/data/pic_test/2013/09/21/HDFS39.jpeg flush /duitang/data/pic_test/2013/11/23/HDFS53.jpeg flush /duitang/data/pic_test/2013/04/10/HDFS64.jpeg flush /duitang/data/pic_test/2013/02/26/HDFS80.jpeg flush /duitang/data/pic_test/2013/09/27/HDFS06.jpeg flush /duitang/data/pic_test/2013/01/07/HDFS46.jpeg flush /duitang/data/pic_test/2013/04/16/HDFS19.jpeg flush /duitang/data/pic_test/2013/10/10/HDFS88.jpeg flush /duitang/data/pic_test/2013/05/11/HDFS29.jpeg flush /duitang/data/pic_test/2013/08/14/HDFS86.jpeg flush /duitang/data/pic_test/2013/07/07/HDFS85.jpeg flush /duitang/data/pic_test/2013/09/21/HDFS51.jpeg flush
disable linux cache后: 普通FS 326 ms 286 ms 303 ms 292 ms 296 ms 283 ms 292 ms 290 ms 273 ms 289 ms beansdb 368.748903275 ms 326.793909073 ms 337.444067001 ms 322.673082352 ms 336.313009262 ms 331.909179688 ms 329.982995987 ms 275.442838669 ms 271.515130997 ms 333.788871765 ms 基于BufferedRandomAccess 127ms 125ms 125ms 123ms 127ms 126ms 125ms 128ms 127ms 126ms
相关推荐
JAVA是一种广泛应用于软件开发的编程语言,随着网络技术的发展,JAVA也提供了许多支持远程文件读取的功能,本文将详细介绍JAVA实现远程文件读取的知识点。 1. Socket 编程 在JAVA中,Socket是最基本的网络编程接口...
Java Socket远程执行任务是一种通过网络通信来实现远程控制或数据传输的技术。在这个示例中,客户端与服务器端通过Socket进行交互,客户端发送特定的命令和一个包含可执行代码的jar包,服务器端接收到这些数据后,...
通过学习Java Socket编程,开发者可以构建功能丰富的网络应用程序,如FTP服务器、邮件系统、实时通信软件等。实践是检验理论的最好方式,动手编写Socket程序,不断尝试和调试,将有助于深化理解和提升技能。
在Java编程领域,远程文件操作是一项重要的功能,特别是在分布式系统和云计算环境中。"Java远程批量文件生成"这个项目就是利用Java的IO(输入/输出)功能来实现在远程服务器上创建多个文件的功能。下面我们将详细...
3.远程教育:使用 Java Socket 编程可以实现远程教育中的实时通信和数据传输。 四、Java Socket 编程的优点 Java Socket 编程有许多优点,例如: 1. 可靠性高:Java Socket 编程基于 TCP/IP 协议,提供了可靠的...
在这个场景中,我们利用Java的Socket API来实现在客户端(Client)和服务器端(Server)之间传输文件的功能。无论文件的大小是KB、MB还是GB,都可以通过这种方式进行安全、可靠的数据传输。 首先,让我们了解一下...
在实际应用中,Java Socket编程可以用于实现聊天应用、文件传输、远程控制等多种功能。为了增强安全性,可以使用SSL/TLS套接字(`SSLSocket`和`SSLServerSocket`)来提供加密的通信。同时,考虑到多线程或多进程的...
Java Socket 是一种网络通信协议,它允许两台计算机(或者运行在计算机上的程序)通过Internet进行双向通信。在这个“java Socket心跳事例”中,我们将会深入探讨如何使用Java的Socket编程来实现心跳机制,这是一种...
Java Socket远程调用Shell是一种通过Java程序利用Socket通信协议实现对远程服务器的Shell命令执行的技术。这种方式常用于系统管理、自动化运维或者分布式系统的组件交互。下面将详细介绍这一技术的实现原理、步骤...
本知识点将深入探讨如何使用Java实现这一功能,包括理解网络编程基础、使用Socket通信以及处理文件I/O。 首先,我们需要理解网络编程的基本概念。在局域网中,计算机通过IP地址和端口号进行通信。IP地址标识了网络...
`Socket`类还提供了其他方法,如`getLocalAddress()`和`getRemoteSocketAddress()`,用于获取本地和远程的网络地址信息,`setSoTimeout(int timeout)`设置读取或写入操作的超时时间。 总的来说,Java的Socket类是...
本项目通过使用TCP/IP协议和Socket编程,构建了一个Android客户端与Java服务器端的通信系统,实现了文件的添加、删除以及断点续传功能。以下是关于这个项目的关键知识点: 1. **TCP/IP协议**:TCP(传输控制协议)...
Java Socket编程是网络编程的基础,它提供了在两个应用程序之间建立通信的途径。在这个"一个简单的java socket程序"中,我们将会探讨如何构建一个基础的服务器端(Server)和客户端(Client)模型,这对于初学者来说...
Java Socket 是 Java 语言中用于实现网络编程的 API,通过 Socket,可以实现与远程服务器的通信。在这里,我们将使用 Java Socket 实现 SMTP 协议来发送邮件。 SMTP 协议简介 SMTP(Simple Mail Transfer Protocol...
Java Socket网络五子棋是一款基于Java编程语言,利用Socket通信技术实现的在线对战游戏。在这款游戏中,玩家可以通过互联网进行实时的五子棋对决,享受远程竞技的乐趣。本项目的核心在于Socket编程,它允许两个远程...
在Java编程环境中,实现远程文件传输是一项常见的任务,特别是在分布式系统和网络应用中。这个小程序可能涉及到了几个关键的Java技术点,包括网络编程、I/O流处理以及可能的多线程技术。以下是对这些知识点的详细...
在Java编程环境中,读取DLT645协议文件通常涉及到智能电表通讯,这是一个用于电力系统中远程抄表的标准。DLT645是一种基于串行通信的协议,允许设备(如电表)与主站系统进行数据交换。为了在Java中实现对这种文件的...
总之,Java Socket编程是构建网络应用程序的关键技术,它使得两个远程程序能够相互通信。了解并掌握如何创建和管理Socket连接,以及如何有效地传输数据,对于任何希望涉足网络编程的Java开发者来说都是至关重要的。
在IT领域,远程桌面连接是一种...总的来说,"Java实现远程桌面"项目涵盖了Java编程、网络通信、图像处理、多线程、输入/输出流、安全性和性能优化等多个IT领域的关键知识点,展示了Java在构建复杂系统中的强大能力。