怎样安卓读取进程虚拟地址数据一个进程的内存数据。比如把“ctfmon.exe”的内存数据写到一个txt文件了保存怎么写呢?

3添加评论分享收藏感谢收起赞同 14 条评论分享收藏感谢收起博客分类:
首先请查看一下JavaAPI,可以看到InputStream读取流有三个方法,分别为read(),read(byte[] b),read(byte[] b, int off, int len)。其中read()方法是一次读取一个字节,鬼都知道效率是非常低的。所以最好是使用后面两个方法。
例如以下代码:
* @param inStream
* @return 字节数组
* @throws Exception
public static byte[] readStream(InputStream inStream) throws Exception {
ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while ((len = inStream.read(buffer)) != -1) {
outSteam.write(buffer, 0, len);
outSteam.close();
inStream.close();
return outSteam.toByteArray();
我们来测试一下:
public static void main(String[] args) {
File file = new File("C:\\ceshi.txt");
FileInputStream fin = new FileInputStream(file);
byte[] filebt = readStream(fin);
System.out.println(filebt.length);
} catch (Exception e) {
e.printStackTrace();
后台会打印这个文本的字节大小。看起来,这个是没有问题的。
关于InputStream类的available()方法这个方法的意思是返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。为什么需要这个方法?因为在一些网络应用中,数据流并不是一次性就能传递的,如果我们还是像上面那样去将这个流转换,会出问题的。我们来做一个例子,这是一个Socket编程的简单例子,具体Socket内容我会在后面文章中解释的。
首先编写两个类,一个用户初始化Socket服务,并且处理每个请求都有新的线程去处理,代码如下:
package com.
import java.net.*;
public class DstService {
public static void main(String[] args) {
// 启动监听端口 8001
ServerSocket ss = new ServerSocket(8001);
boolean bRunning =
while (bRunning) {
// 接收请求
Socket s = ss.accept();
// 将请求指定一个线程去执行
new Thread(new DstServiceImpl(s)).start();
} catch (Exception e) {
e.printStackTrace();
那么处理类我们也来看一下:
package com.
import java.io.*;
import java.net.*;
import com.util.*;
public class DstServiceImpl implements Runnable {
Socket socket =
public DstServiceImpl(Socket s) {
this.socket =
public void run() {
InputStream ips = socket.getInputStream();
OutputStream ops = socket.getOutputStream();
while (true) {
byte[] bt = StreamTool.readStream(ips);
String str = new String(bt);
System.out.println("主机收到信息:" + str);
String restr = "你好,主机已经收到信息!";
ops.write(restr.getBytes());
ops.flush();
} catch (Exception e) {
e.printStackTrace();
至于工具类,我就直接给代码了:
package com.
import java.io.*;
public class StreamTool {
public static void main(String[] args) {
File file = new File("C:\\ceshi.txt");
FileInputStream fin = new FileInputStream(file);
byte[] filebt = readStream(fin);
System.out.println(filebt.length);
} catch (Exception e) {
e.printStackTrace();
* @功能 读取流
* @param inStream
* @return 字节数组
* @throws Exception
public static byte[] readStream(InputStream inStream) throws Exception {
ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while ((len = inStream.read(buffer)) != -1) {
outSteam.write(buffer, 0, len);
outSteam.close();
inStream.close();
return outSteam.toByteArray();
你可以直接运行这个类,会看到流被转换的效果。
我们来写一个Socket客户端测试一下:
package com.
import java.io.*;
import java.net.*;
import com.util.*;
public class DstClient {
public static void main(String[] args) {
Socket socket = new Socket("127.0.0.1", 8001);
// 开启保持活动状态的套接字
socket.setKeepAlive(true);
// 设置读取超时时间
socket.setSoTimeout(30 * 1000);
OutputStream ops = socket.getOutputStream();
String mess = "你好,我是崔素强!";
ops.write(mess.getBytes());
InputStream ips = socket.getInputStream();
byte[] rebyte = StreamTool.readStream(ips);
String remess = new String(rebyte);
System.out.println("收到主机消息:" + remess);
socket.close();
} catch (Exception e) {
e.printStackTrace();
先运行DstService,然后运行客户端,看效果。会发现,控制台没有任何输出。经过调试发现,因为请求死在了
while ((len = inStream.read(buffer)) != -1) {
这行代码上面。这就是在网络应用中会造成的后果。那么如何解决呢?有的人给出了如下代码:
int count = in.available();
byte[] b = new byte[count];
in.read(b);
可是在进行网络操作时往往出错,因为你调用available()方法时,对发发送的数据可能还没有到达,你得到的count是0。需要做如下修改,是我们的读取流方法改成如下:
* @功能 读取流
* @param inStream
* @return 字节数组
* @throws Exception
public static byte[] readStream(InputStream inStream) throws Exception {
int count = 0;
while (count == 0) {
count = inStream.available();
byte[] b = new byte[count];
inStream.read(b);
下面你在运行,会看到服务端和客户端都收到了消息。
关于InputStream.read(byte[] b)和InputStream.read(byte[] b,int off,int len)这两个方法都是用来从流里读取多个字节的,有经验的程序员就会发现,这两个方法经常 读取不到自己想要读取的个数的字节。比如第一个方法,程序员往往希望程序能读取到b.length个字节,而实际情况是,系统往往读取不了这么多。仔细阅读Java的API说明就发现了,这个方法 并不保证能读取这么多个字节,它只能保证最多读取这么多个字节(最少1个)。因此,如果要让程序读取count个字节,最好用以下代码:
int count = 100;
byte[] b = new byte[count];
int readCount = 0; // 已经成功读取的字节的个数
while (readCount & count) {
readCount += inStream.read(b, readCount, count - readCount);
这样就能保证读取100个字节,除非中途遇到IO异常或者到了数据流的结尾情况!
老规矩,最后是上传源代码!
请您到ITEYE看我的原创:
或支持我的个人博客,地址:
下载次数: 587
浏览 201668
public static byte[] readStream(InputStream inStream) throws Exception {& &&& int count = 0;& &&& while (count == 0) {& &&&&&&& count = inStream.available();& &&& }& &&& byte[] b = new byte[count];& &&& inStream.read(b);& &&&& }& 这段代码只能确保读到一段流吧,如果是分段发送的怎么办?----同问~请教博主是否存在此情况,以及应该如何处理~~谢谢
三个read 方法都是一个字节一个字节的读,后两个read方法里面是调用第一个read,效率似乎应该都一样。看了代码,后两个方法是封装了第一个方法,但是如果你自己写的话,估计会更慢。
楼主有个问题, 你把读数据改成public static byte[] readStream(InputStream inStream) throws Exception {& &&& int count = 0;& &&& while (count == 0) {& &&&&&&& count = inStream.available();& &&& }& &&& byte[] b = new byte[count];& &&& inStream.read(b);& &&&& }& 那你要在哪里写数据呢 ?拿到Output就可以写
windseamless 写道windseamless 写道public static byte[] readStream(InputStream inStream) throws Exception {
int count = 0;
while (count == 0) {
count = inStream.available();
byte[] b = new byte[count];
inStream.read(b);
& 如果是这样读取的话,比如在接受心跳数据的时候,发送信条时间间隔比较长的情况下,这个循环一直在执行,去、这样就会造成电脑非常卡windseamless 写道public static byte[] readStream(InputStream inStream) throws Exception {
int count = 0;
while (count == 0) {
count = inStream.available();
byte[] b = new byte[count];
inStream.read(b);
& 如果是这样读取的话,比如在接受心跳数据的时候,发送心跳时间间隔比较长的情况下,这个循环一直在执行,这样就会造成电脑非常卡你说的这个方法很好,这样的话就可以解决死循环问题确实应该增加个休眠
windseamless 写道public static byte[] readStream(InputStream inStream) throws Exception {
int count = 0;
while (count == 0) {
count = inStream.available();
byte[] b = new byte[count];
inStream.read(b);
& 如果是这样读取的话,比如在接受心跳数据的时候,发送信条时间间隔比较长的情况下,这个循环一直在执行,去、这样就会造成电脑非常卡windseamless 写道public static byte[] readStream(InputStream inStream) throws Exception {
int count = 0;
while (count == 0) {
count = inStream.available();
byte[] b = new byte[count];
inStream.read(b);
& 如果是这样读取的话,比如在接受心跳数据的时候,发送心跳时间间隔比较长的情况下,这个循环一直在执行,这样就会造成电脑非常卡你说的这个方法很好,这样的话就可以解决死循环问题
public static byte[] readStream(InputStream inStream) throws Exception {
int count = 0;
while (count == 0) {
count = inStream.available();
byte[] b = new byte[count];
inStream.read(b);
& 如果是这样读取的话,比如在接受心跳数据的时候,发送信条时间间隔比较长的情况下,这个循环一直在执行,去、这样就会造成电脑非常卡可以在里面加个Thread.sleep(200);,然后在定个变量,int k = 0,线程没休眠一次k++,直到k大于等于一个数值,比如15,就即3s内仍无数据,就咔嚓连接
public static byte[] readStream(InputStream inStream) throws Exception {
int count = 0;
while (count == 0) {
count = inStream.available();
byte[] b = new byte[count];
inStream.read(b);
& 如果是这样读取的话,比如在接受心跳数据的时候,发送信条时间间隔比较长的情况下,这个循环一直在执行,去、这样就会造成电脑非常卡windseamless 写道public static byte[] readStream(InputStream inStream) throws Exception {
int count = 0;
while (count == 0) {
count = inStream.available();
byte[] b = new byte[count];
inStream.read(b);
& 如果是这样读取的话,比如在接受心跳数据的时候,发送心跳时间间隔比较长的情况下,这个循环一直在执行,这样就会造成电脑非常卡
cuisuqiang 写道lsh009 写道cuisuqiang 写道lsh009 写道顶,最近在做socket连接,就是read inputstream 死锁了,谢谢你可以看看mina框架你好,服务器端用mina,客户端不要mina用普通的socket或者nio应该可以的吧?没有问题,如果你用mina,别人就必须用mina,那做C和C++的岂不是要死呵呵,确认一下,不然以后有什么问题会很麻烦,毕竟客户端不是我们这边做的,现在只做服务端,再问个问题额,接收到数据 我需要比较长时间处理数据,再返回,用mina需要自己实现多线程吗,还是mina本身实现了,不做多线程的话,后续来的数据,会卡住等待前一个数据处理完才处理吗?谢谢我建议你呢做个实验,在Mina收到数据时打印一条信息,然后长期休眠,然后再模拟发一条数据,看看能不能打印
lsh009 写道cuisuqiang 写道lsh009 写道顶,最近在做socket连接,就是read inputstream 死锁了,谢谢你可以看看mina框架你好,服务器端用mina,客户端不要mina用普通的socket或者nio应该可以的吧?没有问题,如果你用mina,别人就必须用mina,那做C和C++的岂不是要死呵呵,确认一下,不然以后有什么问题会很麻烦,毕竟客户端不是我们这边做的,现在只做服务端,再问个问题额,接收到数据 我需要比较长时间处理数据,再返回,用mina需要自己实现多线程吗,还是mina本身实现了,不做多线程的话,后续来的数据,会卡住等待前一个数据处理完才处理吗?谢谢
cuisuqiang 写道lsh009 写道顶,最近在做socket连接,就是read inputstream 死锁了,谢谢你可以看看mina框架你好,服务器端用mina,客户端不要mina用普通的socket或者nio应该可以的吧?没有问题,如果你用mina,别人就必须用mina,那做C和C++的岂不是要死
lsh009 写道顶,最近在做socket连接,就是read inputstream 死锁了,谢谢你可以看看mina框架你好,服务器端用mina,客户端不要mina用普通的socket或者nio应该可以的吧?
顶,最近在做socket连接,就是read inputstream 死锁了,谢谢你可以看看mina框架
& 上一页 1
cuisuqiang
浏览: 3239307 次
来自: 北京
浏览量:3017432
你这应该只使用于windows系统吧?linux系统怎么转换? ...
貌似少了一个java文件哈 ...
cuisuqiang 写道jlcon 写道chenqidou
这个字段用法是如果相互之类超过多少时间没有数据交互,才抛出的正 ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'基于PHP读取TXT文件向数据库导入海量数据的方法
转载 &更新时间:日 17:09:38 & 作者:
本篇文章小编为大家介绍,基于PHP读取TXT文件向数据库导入海量数据的方法。需要的朋友参考下
有一个TXT文件,包含了10万条记录,格式如下:
列1&&&&&& 列2&&&&&& 列3&& 列4&& 列5a&&& &&& 0&&& 0&&& adductive#1 adducting#1 adducent#1a&&& &&& 0&&& 0&&& nascent#1a&&& &&& 0&&& 0&&& emerging#2 emergent#2a&&& &&& 0.25&&& 0&&& dissilient#1
……………………后面有10万条………………
需求是要导入数据库中,数据表的结构为
word_id&& 自动增量word&&&& 【adductive#1 adducting#1 adducent#1】这一个TXT记录要转换为3个SQL记录value&&&& =第三列-第四列;如果=0,则此条记录略过不插入数据表 代码如下:&?php&&& $file = 'words.txt';//10W条记录的TXT源文件&&& $lines = file_get_contents($file); &&& ini_set('memory_limit', '-1');//不要限制Mem大小,否则会报错 &&& $line=explode("\n",$lines);&&& $i=0;&&& $sql="INSERT INTO words_sentiment (word,senti_type,senti_value,word_type) VALUES ";&&& foreach($line as $key =&$li)&&& {&&&&&&& $arr=explode("&",$li); &&&&&&& $senti_value=$arr[2]-$arr[3];&&&&&&& if($senti_value!=0)&&&&&&& {&&&&&&&&&&& if($i&=20000&&$i&25000)//分批次导入,避免失败&&&&&&&&&&& {&&&&&&&&&&&& $mm=explode(" ",$arr[4]);&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&& foreach($mm as $m)&& //【adductive#1 adducting#1 adducent#1】这一个TXT记录要转换为3个SQL记录&&&&&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&&& $nn=explode("#",$m);&&&&&&&&&&&&&&&&&&&& $word=$nn[0];&&&&&&&&&&&&&&&&&&&& $sql.="(\"$word\",1,$senti_value,2),";//这个地方要注意到是 word有可能包含单引号(如jack's),因此我们要用双引号来包含word(注意转义)&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&& }&&&&&&&&&&& }&&&$i++;&&&&&&& }&&&&&&&& &&& }&&& //echo $i;&&& $sql=substr($sql,0,-1);//去掉最后一个逗号&&& //echo $&&& file_put_contents('.txt', $sql);& //批量导入数据库,5000条一次,大概需要40秒的样子;一次导入太多max_execution_time会不够,导致失败&&&& ?&1,海量数据导入到时候,要注意PHP的一些限制,可以临时调整一下,否则会报错 Allowed memory size of
bytes exhausted (tried to allocate 16 bytes)
2,PHP操作TXT文件
file_get_contents()
file_put_contents()
3,海量导入的时候,最好分批次导入,失败的几率小一些
4,海量导入之前,脚本一定要多次测试无误再使用,比如用100条数据来测试
5,导入之后,如果PHP的mem_limit还是不够的话,程序仍然跑不起来
(建议用修改php.ini的方式来提高mem_limit,而不是用临时的语句)
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具请问android里怎么读取到另一个进程的内存数据?
[问题点数:40分]
本版专家分:0
CSDN今日推荐
本版专家分:16038
2014年8月 移动开发大版内专家分月排行榜第一
2015年8月 移动开发大版内专家分月排行榜第三2014年9月 移动开发大版内专家分月排行榜第三2014年7月 移动开发大版内专家分月排行榜第三
本版专家分:0
本版专家分:23061
2014年11月论坛优秀版主
2014年6月 移动开发大版内专家分月排行榜第一2014年3月 移动开发大版内专家分月排行榜第一
2014年11月 移动开发大版内专家分月排行榜第二2014年4月 移动开发大版内专家分月排行榜第二2014年2月 移动开发大版内专家分月排行榜第二
2014年5月 移动开发大版内专家分月排行榜第三
本版专家分:16038
2014年8月 移动开发大版内专家分月排行榜第一
2015年8月 移动开发大版内专家分月排行榜第三2014年9月 移动开发大版内专家分月排行榜第三2014年7月 移动开发大版内专家分月排行榜第三
本版专家分:3159
本版专家分:12998
2013年2月 总版技术专家分月排行榜第二2013年1月 总版技术专家分月排行榜第二
2013年3月 总版技术专家分月排行榜第三
2014年5月 移动开发大版内专家分月排行榜第一2014年4月 移动开发大版内专家分月排行榜第一
2013年2月 .NET技术大版内专家分月排行榜第二2013年1月 .NET技术大版内专家分月排行榜第二
本版专家分:11554
2014年3月 移动开发大版内专家分月排行榜第二
本版专家分:0
匿名用户不能发表回复!|
其他相关推荐记录开发的点滴,更好的阅读体验请访问:leehao.me
使用内存映射文件在进程间共享数据
Windows提供了多种机制允许进程之间能够共享数据。比如,WM_COPYDATA消息,剪贴板,邮件槽(mailslot),管道(pipe),套接字(socket)等。在同一台机器上共享数据最底层的机制就是内存映射文件。
使用内存映射文件的步骤如下:
创建或打开一个文件内核对象,该对象标识了要用作内存映射文件的那个磁盘文件(CreateFile)
创建一个文件映射内核对象(CreateFileMapping)
告诉系统把文件映射对象的部分或全部映射到进程的地址空间中(MapViewOfFile)
调用CreateFile是为了告诉操作系统文件映射的物理存储器所在的位置。为了告诉系统文件映射对象需要多大的物理存储器,须调用CreateFileMapping。在创建了文件映射对象之后,还需要使用MapViewOfFile来将文件的数据映射到进程的地址空间中。当我们把一个文件映射到地址空间中的时候,不必一下子映射整个文件,可以每次只把一小部分映射到地址空间中。文件中被映射到进程地址空间中的部分被称为视图(View)。
用完内存映射文件之后,须执行以下步骤来做清理工作:
告诉系统取消从进程地址空间对文件映射对象的映射(UnmapViewOfFile)
关闭文件映射内核对象(CloseHandle)
关闭文件内核对象(CloseHandle)
不再需要把文件的数据映射到进程的地址空间时,需要调用UnmapViewOfFile来释放内存区域。如果不这样做,在进程终止之前,区域将得不到释放。
无论以什么方式创建的内核对象,我们都要调用CloseHandle向系统表明我们已经结束使用对象,否则会在进程继续运行的过程中引起资源泄漏。
如果我们希望创建的文件映射的物理存储器不是磁盘上的文件,而是从页交换文件中调拨物理存储器,则只需要调用CreateFileMapping,并将INVALID_HANDLE_VALUE作用hFile参数传入。
当我们创建了文件映射对象,对将其映射到进程地址空间中,我们就可以像使用任何内存区域一样使用它了。如果想要在其他进程共享数据,那么可以在调用CreateFileMapping时指定pszName该文件映射对象的名称。这样,其他进程就可以以该名称来调用CreateFileMapping或者OpenFileMapping,并使用该文件映射对象的数据了。
第一个进程
该进程首先调用CreateFileMapping创建文件映射对象,可以看到传入了INVALID_HANDLE_VALUE参数,这表明该文件映射对象从页交换文件中调拨物理存储器。另外,该文件映射对象命名为“Global\\MyFileMappingObject”。
接着,调用MapViewOfFile创建文件映射对象的视图,并将其返回值赋给pBuf,再调用CopyMemory函数将一个字符串写到该视图中去以让其他进程访问。
当进程不再需要使用文件映射对象,需要调用CloseHandle关闭其句柄。
#include &windows.h&
#include &conio.h&
#include "stdafx.h"
#define BUF_SIZE 256
TCHAR sName[] = _T("Global\\MyFileMappingObject");
TCHAR sNick[] = _T("Message from process 1!");
int _tmain(int argc, _TCHAR* argv[])
HANDLE hMapF
LPCTSTR pB
hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE,
NULL, PAGE_READWRITE, 0, BUF_SIZE, sName);
if (hMapFile == NULL) {
_tprintf(TEXT("Could not create file mapping object (%d).\n"), GetLastError());
pBuf = (LPCTSTR)MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE);
if (pBuf == NULL) {
_tprintf(TEXT("Could not map view of file (%d).\n"), GetLastError());
CloseHandle(hMapFile);
CopyMemory((PVOID)pBuf, sNick, (_tcslen(sNick) * sizeof(TCHAR)));
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
第二个进程
第二个进程首先调用OpenFileMapping函数开打开命名为“Global\\MyFileMappingObject”的文件映射对象。然后调用MapViewOfFile来获得视图的指针,pBuf。获得该指针后,便可以像使用一般的字符串一要来操作该字符串,调用MessgeBox可以显示该来自进程1的字符串。
#include &windows.h&
#include "stdafx.h"
#define BUF_SIZE 256
TCHAR szName[]= _T("Global\\MyFileMappingObject");
int _tmain(int argc, _TCHAR* argv[])
HANDLE hMapF
LPCTSTR pB
hMapFile = OpenFileMapping(FILE_MAP_READ, FALSE, szName);
if (hMapFile == NULL) {
_tprintf(TEXT("Could not open file mapping object (%d).\n"),
GetLastError());
pBuf = (LPTSTR)MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, BUF_SIZE);
if (pBuf == NULL) {
_tprintf(TEXT("Could not map view of file (%d).\n"), GetLastError());
CloseHandle(hMapFile);
MessageBox(NULL, pBuf, _T("Process2"), MB_OK);
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
扫码向博主提问
非学,无以致疑;非问,无以广识
擅长领域:
没有更多推荐了,}

我要回帖

更多关于 读取进程全部内存 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信