gpt4 book ai didi

java - 通过网络附加文本文件 Android API SDK 分钟 19

转载 作者:行者123 更新时间:2023-12-01 19:00:33 27 4
gpt4 key购买 nike

我对 Java 比较陌生,并且在附加到文本文件时遇到一些困难。能够创建并写入它,但是如果该文件存在,我只能覆盖它。

我试图利用 StandardOpenOption 但这需要 SDK 26(我正在为 Android 7 及以上版本进行开发)这意味着由于 Min SDK,我无法使用 StandardOpenOption。

还有其他方法可以实现这一目标吗?这是我当前正在运行的代码,这是利用 hierynomus 访问 Windows 网络路径

import android.content.Context;
import com.hierynomus.msdtyp.AccessMask;
import com.hierynomus.msfscc.FileAttributes;
import com.hierynomus.mssmb2.SMB2CreateDisposition;
import com.hierynomus.mssmb2.SMB2CreateOptions;
import com.hierynomus.mssmb2.SMB2ShareAccess;
import com.hierynomus.mssmb2.SMBApiException;
import com.hierynomus.smbj.SMBClient;
import com.hierynomus.smbj.SmbConfig;
import com.hierynomus.smbj.auth.AuthenticationContext;
import com.hierynomus.smbj.connection.Connection;
import com.hierynomus.smbj.session.Session;
import com.hierynomus.smbj.share.DiskShare;
import com.hierynomus.smbj.share.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.HashSet;

public class NetworkLogon {


// connection paramsStaticLoggerBinder
static String sambaDomain = null; // can be null

// Need to pass over Message (What to print) Filename, Folder. As this could be writing an Out and a Log file.
public static void main(Context mContext, String message, String filename, String Folder) throws IOException {

String sambaSharedPath = SharedPrefs.getserverPath(mContext);
String sambaUsername = SharedPrefs.getsmbUser(mContext);
String sambaPass = SharedPrefs.getsmbPass(mContext);
String sambaIP = SharedPrefs.getserverName(mContext);

// String filename = "test.txt";

SmbConfig cfg = SmbConfig.builder().build();
SMBClient client = new SMBClient(cfg);
Connection connection = client.connect(sambaIP);
Session session = connection.authenticate(new AuthenticationContext(sambaUsername, sambaPass.toCharArray(), sambaDomain));
DiskShare share = (DiskShare) session.connectShare(sambaSharedPath);

// this is com.hierynomus.smbj.share.File !
File f = null;
int idx = filename.lastIndexOf("/");

// if file is in folder(s), create them first
if (idx > -1) {
String folder = Folder+"\\"+filename.substring(0, idx);
try {
if (!share.folderExists(folder)) share.mkdir(folder);
} catch (SMBApiException ex) {
throw new IOException(ex);
}

}

if (!share.fileExists(Folder+"\\"+filename)) {
f = share.openFile(Folder+"\\"+filename,
new HashSet<>(Arrays.asList(AccessMask.GENERIC_ALL)),
new HashSet<>(Arrays.asList(FileAttributes.FILE_ATTRIBUTE_NORMAL)),
SMB2ShareAccess.ALL,
SMB2CreateDisposition.FILE_CREATE,
new HashSet<>(Arrays.asList(SMB2CreateOptions.FILE_DIRECTORY_FILE))
);
}
if (f == null){

f = share.openFile(Folder+"\\"+filename,
new HashSet<>(Arrays.asList(AccessMask.GENERIC_ALL)),
new HashSet<>(Arrays.asList(FileAttributes.FILE_ATTRIBUTE_NORMAL)),
SMB2ShareAccess.ALL,
SMB2CreateDisposition.FILE_OPEN_IF,
new HashSet<>(Arrays.asList(SMB2CreateOptions.FILE_DIRECTORY_FILE)) );

}

OutputStream os = f.getOutputStream();
os.write(message.getBytes());
os.flush();
os.close();
f.close();

}
}

最佳答案

尝试了各种方法都没有成功,我决定不再使用 hierynomus.smbj,因为在尝试使用不同的函数时,我在类中遇到了各种错误。并决定使用 jcifs,并且立即正常工作。

代码示例:

// required imports
import android.content.Context;
import java.io.IOException;
import jcifs.smb.NtlmPasswordAuthentication;
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileOutputStream;

public class NetworkLogon {



public static void main(Context mContext, String message, String filename, String Folder) throws IOException {

String sambaSharedPath = SharedPrefs.getserverPath(mContext);
String sambaUsername = SharedPrefs.getsmbUser(mContext);
String sambaPass = SharedPrefs.getsmbPass(mContext);
String sambaIP = SharedPrefs.getserverName(mContext);
try{

String url = "smb://"+sambaIP+"/"+ sambaSharedPath +"/"+ Folder +"/"+ filename;
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(
null, sambaUsername, sambaPass);
SmbFile sfile = new SmbFile(url, auth);

SmbFileOutputStream sfos = new SmbFileOutputStream(sfile, true);

sfos.write((message+"\n").getBytes());
sfos.close();

}catch(Exception e){
throw new IOException(e);
}

}
}

对新手的代码解释:

public static void main(Context mContext, String message, String filename, String Folder) throws IOException {

Context mContext, String message filename 文件夹用于传递调用位置的内容:示例:

                    String Folder ="Logs";
String message = timedateFormat+": Login Failed, Details are incorrect";
String filename = dateNow+"-AndroidHandHeld.log";
NetworkLogon.main(mContext, message, filename, Folder);

您当然可以自由输入:

NetworkLogon.main(mContext, "Yourmessage", "Somefilename", "SomeFolder");

代码的 SharedPrefs 部分是另一个用于获取 SharedPreferences 中存储的详细信息的类。

字符串 url 将网络路径、共享文件夹、文件夹和文件名组合在一起。

NtlmPasswordAuthentication 启动身份验证。参数(域、用户名、密码)在我的代码中,域显示为空,因为我目前尚未完成域的定义。

SmbFile 使用路径 + auth 方法进行连接。

Outputstream 正在设置文件并表示要追加

然后另外两行将文件写出并关闭文件

关于java - 通过网络附加文本文件 Android API SDK 分钟 19,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59643352/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com