我有一个文本文件,其中包含给定的数据
例如
PUFGUjVRallYZDNaazFtVjVObU1zWm5ZcUJUYU5ORk4zbGthNHNDVUdSMlFVQmpSVEoxUUNSallYaFhkanBITXBGR1NTQnpZRTltZE1OalVzSkdXQ0Z6WXR0V2RpTmpTdXgwTWs5V1lZSkZiWjFXT29OV2JSVlhaSTUwYUpwR040UUZXTzVHVXFoWFVRcFdWNHdVTUJ0Q1VHSmxXVlJVTlJCMVE1VTFWV
PUFGUjVRallYZDNaazFtVjVObU1zWm5ZcUJUYU5ORk4zbGthNHNDVUdSMlFVQmpSVEoxUUNSallYaFhkanBITXBGR1NTQnpZRTltZE1OalVzSkdXQ0Z6WXR0V2RpTmpTdXgwTWs5V1lZSkZiWjFXT29OV2JSVlhaSTUwYUpwR040UUZXTzVHVXFoWFVRcFdWNHdVTUJ0Q1VHSmxXVlJVTlJCMVE1VTFWV
Run Code Online (Sandbox Code Playgroud)
现在我想逐行读取数据.这意味着首先我要阅读
PUFGUjVRallYZDNaazFtVjVObU1zWm5ZcUJUYU5ORk4zbGthNHNDVUdSMlFVQmpSVEoxUUNSallYaFhkanBITXBGR1NTQnpZRTltZE1OalVzSkdXQ0Z6WXR0V2RpTmpTdXgwTWs5V1lZSkZiWjFXT29OV2JSVlhaSTUwYUpwR040UUZXTzVHVXFoWFVRcFdWNHdVTUJ0Q1VHSmxXVlJVTlJCMVE1VTFWV
Run Code Online (Sandbox Code Playgroud)
然后下一个剩下的.谁有任何想法?
我的iPad应用程序有一个小的下载工具,我想使用NSFileHandle附加数据.问题是创建调用只返回空文件句柄.可能是什么问题呢?以下是应该创建我的文件句柄的三行代码:
NSString *applicationDocumentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
self.finalPath = [applicationDocumentsDirectory stringByAppendingPathComponent: self.fileName];
NSFileHandle *output = [NSFileHandle fileHandleForWritingAtPath:self.finalPath];
Run Code Online (Sandbox Code Playgroud)
我检查了文件路径,我没有看到任何错误.
TYIA
我的应用导航基础.UItextView用于注释UIViewController.我正在写文本数据到文件.现在我需要写下附加模式,下面的代码我正在尝试,但每次用相同的文本数据写入两次,如果下一个文本数据到文件则不附加.
- (void)saveText:(id)sender
{
[self.textview resignFirstResponder];
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [documentPaths objectAtIndex:0];
NSString *documentTXTPath = [documentsDirectory stringByAppendingPathComponent:@"Notes.txt"];
NSString *savedString = textview.text;
[savedString writeToFile:documentTXTPath atomically:YES];
NSFileHandle *myHandle = [NSFileHandle fileHandleForUpdatingAtPath:documentTXTPath ];
[myHandle seekToEndOfFile];
[myHandle writeData: [savedString dataUsingEncoding:NSUTF8StringEncoding]];
[myHandle closeFile];
}
Run Code Online (Sandbox Code Playgroud) 首先,我是iOS和Swift的新手,来自Android/Java编程背景.因此,对于我来说,尝试写入文件时捕获异常的想法是第二天性,如果缺少空间,文件权限问题或文件中可能发生的任何其他事情(根据我的经验,已发生) .我也明白,在Swift中,异常与Android/Java不同,所以这不是我在这里要求的.
我试图使用NSFileHandle附加到一个文件,如下所示:
let fileHandle: NSFileHandle? = NSFileHandle(forUpdatingAtPath: filename)
if fileHandle == nil {
//print message showing failure
} else {
let fileString = "print me to file"
let data = fileString.dataUsingEncoding(NSUTF8StringEncoding)
fileHandle?.seekToEndOfFile()
fileHandle?.writeData(data!)
}
Run Code Online (Sandbox Code Playgroud)
但是,函数seekToEndOfFile()和writeData()函数都表明它们会抛出某种异常:
如果文件描述符已关闭或无效,如果接收器表示未连接的管道或套接字端点,文件系统上没有剩余空闲空间,或者发生任何其他写入错误,则此方法引发异常. - Apple文档
writeData()
那么在Swift 2.0中处理这个问题的正确方法是什么?我读过的联系
斯威夫特语言错误处理,的try-catch斯威夫特例外,NSFileHandle写数据:异常处理,雨燕2.0的异常处理,以及如何捕捉在斯威夫特的例外,但他们都没有直接回答我的问题.我确实读过一些关于在Swift代码中使用objective-C的东西,但由于我是iOS新手,我不知道这个方法是什么,似乎无法在任何地方找到它.我还尝试了新的Swift 2.0 do-catch块,但他们没有意识到NSFileHandle方法会抛出任何类型的错误,很可能因为函数文档没有throw关键字.
我知道我可以让应用程序崩溃,如果它用完了空间或其他什么,但由于应用程序可能会在以后发布到应用商店,我不希望这样.那么我如何以Swift 2.0的方式做到这一点呢?
编辑: 这个目前只是一个只有Swift代码的项目,所以即使看起来有一种方法可以在Objective-C中做到这一点,我也不知道如何将两者混合在一起.
我正在使用块从a NSFileHandle(从a NSPipe)读取数据readabilityHandler:
fileHandle.readabilityHandler = ^( NSFileHandle *handle ) {
[self processData: [handle availableData]];
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,我得到了我期望提供给我的processData方法的所有数据.问题是我需要知道何时读取了最后一块数据.如果它到达文件结尾,availableData则应返回一个空NSData实例,但问题是在EOF上不再调用可达性处理程序.
我找不到任何关于如何在EOF上获得某种通知或回调的信息.那我错过了什么?Apple是否真的在没有EOF回调的情况下提供异步读取API?
顺便说一下,我不能使用基于runloop的readInBackgroundAndNotify方法,因为我没有可用的runloop.如果我无法使用NSFileHandleAPI,我可能会直接使用调度源来执行IO.
使用NSFileHandle,使用truncateFileAtOffset从文件末尾删除n个字符非常容易.
-(void)removeCharacters:(int)numberOfCharacters fromEndOfFile:(NSFileHandle*)fileHandle {
unsigned long long fileLength = [fileHandle seekToEndOfFile];
[fileHandle truncateFileAtOffset:fileLength - numberOfCharacters];
}
Run Code Online (Sandbox Code Playgroud)
但是,如果不必将所有剩余数据复制到内存中,覆盖文件然后将剩余数据写回文件,则无法从文件前面删除字符.
-(void)removeCharacters:(int)numberOfCharacters fromBeginningOfFile:(NSFileHandle*)fileHandle {
[fileHandle seekToFileOffset:numberOfCharacters];
NSData *remainingData = [fileHandle readDataToEndOfFile];
[fileHandle truncateFileAtOffset:0];
[fileHandle writeData:remainingData];
}
Run Code Online (Sandbox Code Playgroud)
此代码有效,但将成为大文件的责任.我错过了什么?
理想情况下,我希望能够执行replaceCharactersInRange:withData:
我曾经NSFileHandle把writedata写成文件.
NSFilehandle *handle = [NSFileHandle fileHandleForWritingAtPath:@"path/of/file"];
@try {
[handle writedata:data];
} @catch (NSException *e) {
// when exception occur, never got here
NSLog(@"%@", e);
}
Run Code Online (Sandbox Code Playgroud)
当我的设备磁盘空间已满时,调用writedata将失败.但我无法抓住异常.
我的程序日志信息:
2014-05-23 16:17:24.435 mytest[12919:3203] An uncaught exception was raised
2014-05-23 16:17:24.435 mytest[12919:3203] *** -[NSConcreteFileHandle writeData:]:
No space left on device
2014-05-23 16:17:24.436 mytest[12919:3203] (
0 CoreFoundation 0x00007fff8fae725c __exceptionPreprocess + 172
1 libobjc.A.dylib 0x00007fff8cbb3e75 objc_exception_throw + 43
2 CoreFoundation 0x00007fff8fae710c +[NSException raise:format:] + 204
3 Foundation 0x00007fff93640f31 __34-[NSConcreteFileHandle writeData:]_block_invoke + 84 …Run Code Online (Sandbox Code Playgroud) 更新4
Per Greg的建议我创建了一对图像/文本,使用100k块显示从37k图像到base64编码的输出.由于文件只有37k,所以可以说循环只迭代一次,因此没有附加任何内容.另一对使用10k块显示从相同的37k图像到base64编码的输出.由于文件是37k,循环迭代四次,并且数据被明确附加.
对这两个文件进行差异显示,在10kb块文件上有一个很大的区别,它从第214行开始,到第640行结束.
更新3
这是我的代码现在的位置.清理了一下但仍产生相同的效果:
// Read data in chunks from the original file
[originalFile seekToEndOfFile];
NSUInteger fileLength = [originalFile offsetInFile];
[originalFile seekToFileOffset:0];
NSUInteger chunkSize = 100 * 1024;
NSUInteger offset = 0;
while(offset < fileLength) {
NSData *chunk = [originalFile readDataOfLength:chunkSize];
offset += chunkSize;
// Convert the chunk to a base64 encoded string and back into NSData
NSString … 我正在尝试NSTask使用Cocoa中的标准错误读取数据waitForDataInBackgroundAndNotify.以下代码确实读取了流,因此它已经部分工作了.
我遇到的问题是,有时NSFileHandleDataAvailableNotification开始重复启动(每秒数千次),根本没有新数据([data length]返回0).然后我的进程开始使用大量CPU,使机器停止运转.你们中的任何人过去曾经打过这样的事吗?提前致谢.
/**
* Start reading from STDERR
*
* @private
*/
- (void)startReadingStandardError {
NSFileHandle *fileHandle = [_task.standardError fileHandleForReading];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(errorData:)
name:NSFileHandleDataAvailableNotification
object:fileHandle];
[fileHandle waitForDataInBackgroundAndNotify];
}
/**
* Fired whenever new data becomes available on STDERR
*
* @private
*/
-(void) errorData: (NSNotification *) notification
{
NSFileHandle *fileHandle = (NSFileHandle*) [notification object];
NSData *data = [fileHandle availableData];
if ([data length]) {
// consume data
}
[fileHandle …Run Code Online (Sandbox Code Playgroud) 我有一个雨燕程序,它读出FileHandle.standardInput(在Objective-C,这将是+[NSFileHandle fileHandleWithStandardInput],当它击中的输入流档案结尾应该终止阅读,但是当我运行它使用终端(在MacOS塞拉利昂)作为输入,当我按 Ctrl+D 时它不会检测到文件结尾。
这是我正在做的事情的一个简化示例。这个程序简单地从标准输入读取并将它读取的内容写入标准输出:
#!/usr/bin/swift
import Foundation
let input = FileHandle.standardInput
let output = FileHandle.standardOutput
let bufferSize = 1024
var data = input.readData(ofLength: bufferSize)
while data.count > 0 {
output.write(data)
data = output.readData(ofLength: bufferSize)
}
Run Code Online (Sandbox Code Playgroud)
我希望在到达文件末尾时readData(ofLength:)返回一个为零的Data对象count。
当我使用重定向到标准输入的文件运行时,如下所示:
./echo.swift < foo.txt
Run Code Online (Sandbox Code Playgroud)
它写出文件并终止。
但是,如果我像这样运行它:
./echo.swift
Run Code Online (Sandbox Code Playgroud)
然后键入一些文本并按 Ctrl+D,我希望它将 Ctrl+D 视为文件结尾并终止。但它不会那样做。它只是不断地运行和呼应线条。如果我一遍又一遍地按 Ctrl+D,它最终会终止,但这不是我想要的。
改变bufferSize似乎没有帮助。如果我将其设置为1.
我怀疑我需要在stdin文件描述符或终端设备上设置某种缓冲参数,或者捕获信号或其他东西,但我不知道是什么。
我知道我可以改用 C stdio fread()API,它可以从终端正确检测文件结束条件,或者我可以使用 SwiftreadLine(_:)从标准输入中读取,而不必担心文件句柄/描述符,但我想知道是否有一种方法可以使用FileHandle原始文件描述符或原始文件描述符来执行此操作,而无需重新实现 C stdio。
更新:在花了一个小时查看 …
nsfilehandle ×10
objective-c ×5
cocoa ×3
ios ×3
iphone ×2
macos ×2
swift ×2
asynchronous ×1
base64 ×1
cocoa-touch ×1
exception ×1
nsdata ×1
nsexception ×1
nstask ×1
swift2 ×1
uitextview ×1