定位上传1

This commit is contained in:
lijia 2024-03-29 15:34:57 +08:00
parent 87eb1734fa
commit bd050080c5
13 changed files with 507 additions and 34 deletions

View File

@ -1,10 +1,11 @@
# 友盟+一键登录 # 友盟+一键登录
友盟+上的appkey用来唤醒与阿里云购买appkey同样可以唤醒前端sdk?)不同(后台需配置友盟+上的appkey来获取token 友盟+上的appkey用来唤醒与阿里云购买appkey同样可以唤醒前端sdk?)不同(后台需配置友盟+上的appkey来获取token
# 无法获取sha1失败 # 无法获取sha1失败
可通过gradle-app-android-signingReport获取 可通过gradle-app-android-signingReport获取
# gradle无法下载或者下载慢问题-替换阿里云或腾讯云镜像 # gradle无法下载或者下载慢问题-替换阿里云或腾讯云镜像
添加maven { url 'https://maven.aliyun.com/repository/central' } 添加maven { url 'https://maven.aliyun.com/repository/central' }
maven { url 'https://maven.aliyun.com/nexus/content/repositories/google' } maven { url 'https://maven.aliyun.com/nexus/content/repositories/google' }
distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.2-bin.zip distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.2-bin.zip
distributionUrl=https\://emas-devops-cdn.aliyuncs.com/distributions/gradle-7.2-bin.zip distributionUrl=https\://emas-devops-cdn.aliyuncs.com/distributions/gradle-7.2-bin.zip

View File

@ -92,7 +92,9 @@
android:name="com.amap.api.v2.apikey" android:name="com.amap.api.v2.apikey"
android:value="e0c32c80b14f78b770b3671add9c4515" /> android:value="e0c32c80b14f78b770b3671add9c4515" />
<service android:name="com.amap.api.location.APSService" /> <service android:name="com.amap.api.location.APSService"
android:foregroundServiceType="location"/>
<service android:name=".service.UpLocationService"/>
<activity <activity
android:name=".ui.LauncherActivity" android:name=".ui.LauncherActivity"

View File

@ -1,16 +1,25 @@
package com.dahe.gldriver.base package com.dahe.gldriver.base
import android.app.Application import android.app.Application
import android.app.PendingIntent
import android.app.PendingIntent.*
import android.content.Context import android.content.Context
import android.content.Intent
import android.util.Log import android.util.Log
import com.dahe.gldriver.BuildConfig import com.dahe.gldriver.BuildConfig
import com.dahe.gldriver.R
import com.dahe.gldriver.net.Api import com.dahe.gldriver.net.Api
import com.dahe.gldriver.oss.OssServiceUtil import com.dahe.gldriver.oss.OssServiceUtil
import com.dahe.gldriver.push.PushHelper import com.dahe.gldriver.push.PushHelper
import com.dahe.gldriver.ui.HomeActivity
import com.dahe.gldriver.utils.OrderUtils
import com.dahe.mylibrary.CommonBaseLibrary import com.dahe.mylibrary.CommonBaseLibrary
import com.dahe.mylibrary.utils.AppUtils
import com.esign.esignsdk.EsignSdk import com.esign.esignsdk.EsignSdk
import com.github.gzuliyujiang.dialog.DialogConfig import com.github.gzuliyujiang.dialog.DialogConfig
import com.github.gzuliyujiang.dialog.DialogStyle import com.github.gzuliyujiang.dialog.DialogStyle
import com.gyf.cactus.Cactus
import com.gyf.cactus.callback.CactusBackgroundCallback
import com.tencent.bugly.crashreport.CrashReport import com.tencent.bugly.crashreport.CrashReport
import com.umeng.commonsdk.UMConfigure import com.umeng.commonsdk.UMConfigure
import com.umeng.message.PushAgent import com.umeng.message.PushAgent
@ -46,30 +55,40 @@ class App : Application() {
EsignSdk.getInstance().init(AppConfig.E_KEY, AppConfig.E_LICENSE) EsignSdk.getInstance().init(AppConfig.E_KEY, AppConfig.E_LICENSE)
initUmeng() initUmeng()
// PendingIntent pendingIntent = var pendingIntent: PendingIntent = getActivity(
// PendingIntent.getActivity(this, 0, new Intent(this, HomeActivity.class), PendingIntent.FLAG_UPDATE_CURRENT); applicationContext, 0,
// Cactus.getInstance() Intent(applicationContext, HomeActivity::class.java),
// .isDebug(true) FLAG_UPDATE_CURRENT
// //可选,设置通知栏点击事件 )
// .setPendingIntent(pendingIntent) Cactus.instance
//// .setBackgroundMusicEnabled(true)//可选,退到后台是否可以播放音乐 .isDebug(true)
//// .setMusicId(R.raw.main) //可选,设置音乐 .setChannelId(AppUtils.getAppPackageName())
//// .setPendingIntent(pendingIntent)//可选,设置通知栏点击事件 .setChannelName(AppUtils.getAppPackageName())
//// .addCallback(new CactusCallback())//可选,运行时回调 //可选,设置通知栏点击事件
.setPendingIntent(pendingIntent)
.setBackgroundMusicEnabled(true)//可选,退到后台是否可以播放音乐
// .setMusicInterval(20000)//设置音乐间隔时间时间间隔越长越省电默认间隔时间是0
.setMusicId(R.raw.main) //可选,设置音乐
// .addCallback(new CactusCallback())//可选,运行时回调
// .setCrashRestartUIEnabled(true) //可选设置奔溃可以重启google原生rom android 10以下可以正常重启 // .setCrashRestartUIEnabled(true) //可选设置奔溃可以重启google原生rom android 10以下可以正常重启
// .setCrashRestartUIEnabled(true)//可选设置奔溃可以重启google原生rom android 10以下可以正常重启 .setTitle("大河好运")
// .setTitle("大河好运") .setContent("大河好运司机端为您提供服务")
// .hideNotificationAfterO(true) .hideNotificationAfterO(true)
// .setSmallIcon(R.drawable.right_icon) .setSmallIcon(R.mipmap.app_icon)
// .addBackgroundCallback(new CactusBackgroundCallback() { .addCallback {
// @Override OrderUtils.getInstance().upLocation(applicationContext)
// public void onBackground(boolean b) { println("22222222222")
// if (b){ Log.i("lijia","11111111")
//// getBillLocation(); }
// } .addBackgroundCallback(object : CactusBackgroundCallback {
// }
// }) override fun onBackground(background: Boolean) {
// .register(this); if (background) {
// getBillLocation();
}
}
})
.register(this)
} }
override fun attachBaseContext(base: Context) { override fun attachBaseContext(base: Context) {
@ -104,7 +123,7 @@ class App : Application() {
// 推送注册 // 推送注册
val api = PushAgent.getInstance(this) val api = PushAgent.getInstance(this)
PushHelper.setting(api) PushHelper.setting(api)
api.register(object : UPushRegisterCallback{ api.register(object : UPushRegisterCallback {
override fun onSuccess(p0: String?) {//注册厂商通道 override fun onSuccess(p0: String?) {//注册厂商通道
Log.e( Log.e(
"TAG", "TAG",

View File

@ -13,6 +13,7 @@ object AppConfig {
const val DATA = "DA_HE_DATA" const val DATA = "DA_HE_DATA"
const val PHONE = "DA_HE_PHONE" const val PHONE = "DA_HE_PHONE"
const val ORDER_ID = "DA_HE_ORDER_ID" const val ORDER_ID = "DA_HE_ORDER_ID"
const val NEED_UP_ORDER = "DA_HE_NEED_UP_ORDER"
const val CAR_ID = "DA_HE_CAR_ID" const val CAR_ID = "DA_HE_CAR_ID"
const val IS_SHOW = "DA_HE_IS_SHOW" const val IS_SHOW = "DA_HE_IS_SHOW"
const val IS_FIRST_OPEN = "DA_HE_IS_FIRST_OPEN" const val IS_FIRST_OPEN = "DA_HE_IS_FIRST_OPEN"

View File

@ -224,6 +224,22 @@ data class Resources(
) )
/**
* 司机轨迹上传
* @property latitude String
* @property longitude String
* @property orderId String
* @property waybillId String
* @constructor
*/
data class UpLocation(
val latitude: Double,
val longitude: Double,
val orderId: String,
val waybillId: String
)

View File

@ -22,6 +22,7 @@ import com.dahe.gldriver.bean.UpBankInfoBean
import com.dahe.gldriver.bean.UpCaptain import com.dahe.gldriver.bean.UpCaptain
import com.dahe.gldriver.bean.UpDriverInfoBean import com.dahe.gldriver.bean.UpDriverInfoBean
import com.dahe.gldriver.bean.UpDrivingInfoBean import com.dahe.gldriver.bean.UpDrivingInfoBean
import com.dahe.gldriver.bean.UpLocation
import com.dahe.gldriver.bean.UpPart import com.dahe.gldriver.bean.UpPart
import com.dahe.gldriver.bean.UpPersonInfoBean import com.dahe.gldriver.bean.UpPersonInfoBean
import com.dahe.gldriver.bean.UpPicBean import com.dahe.gldriver.bean.UpPicBean
@ -250,6 +251,15 @@ interface Api {
fun orderDetail(@Query("orderId") orderId: String): Observable<CommonResponseBean<OrderDetailBean>> fun orderDetail(@Query("orderId") orderId: String): Observable<CommonResponseBean<OrderDetailBean>>
/**
* 司机轨迹上传
* @param [Error type: Missed a type for a value parameter <no name provided>]
* @return Observable<CommonResponseBean<Any>>
*/
@POST(BASE_URL + "driver/driverWaybill/driverUploadLocus")
fun driverUploadLocus(@Body upLocation: UpLocation): Observable<CommonResponseBean<Any>>
/** /**
* 司机接单 * 司机接单
* */ * */
@ -487,8 +497,6 @@ interface Api {
fun safeClassroomDetail(@Query("classroomId") problemId: String): Observable<CommonResponseBean<QueDetail>> fun safeClassroomDetail(@Query("classroomId") problemId: String): Observable<CommonResponseBean<QueDetail>>
/** /**
* 获取APP最新版本信息 * 获取APP最新版本信息
* @return Observable<CommonResponseBean<ProBean>> * @return Observable<CommonResponseBean<ProBean>>

View File

@ -0,0 +1,142 @@
package com.dahe.gldriver.service
import android.app.Service
import android.content.Intent
import android.os.Environment
import android.os.Handler
import android.os.IBinder
import android.os.Message
import android.util.Log
import com.amap.api.location.AMapLocation
import com.dahe.gldriver.bean.OrderDetailBean
import com.dahe.gldriver.bean.UpLocation
import com.dahe.gldriver.net.BaseObserver
import com.dahe.gldriver.net.DataManager
import com.dahe.gldriver.net.RxHttpCallBack
import com.dahe.gldriver.utils.GDLocationUtils
import com.dahe.mylibrary.net.CommonResponseBean
import com.dahe.mylibrary.utils.CrashHandler
import com.dahe.mylibrary.utils.CrashHandler2
import com.dahe.mylibrary.utils.FileIOUtils
import com.dahe.mylibrary.utils.ToastUtils
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.schedulers.Schedulers
import java.io.File
import java.io.FileOutputStream
import java.io.PrintWriter
import java.io.StringWriter
import java.io.Writer
import java.text.DateFormat
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Timer
import java.util.TimerTask
/**
* @ClassName UpLocationService
* @Author john
* @Date 2024/3/28 09:08
* @Description TODO
*/
class UpLocationService : Service() {
private val hd = Handler { msg: Message ->
when (msg.what) {
123 -> {
//获取文件输出路径
val path = Environment.getExternalStorageDirectory()
.toString() + "/crashinfo/"
val time: String = formatter.format(Date())
val time2: String = formatter2.format(Date())
val fileName = "crash-$time.txt"
GDLocationUtils.instance.getLocation(application) {
if (it.getErrorCode() == 0 && it.latitude != 0.0) {
FileIOUtils.writeFileFromString(
path + fileName,
"""当前时间:${time2},经纬度:${it.latitude}:${it.longitude}""",
true
)
} else {
FileIOUtils.writeFileFromString(
path + fileName,
"""当前时间:${time2},经纬度:${it.latitude}${it.errorInfo}""",
true
)
}
}
// var orderString = BaseSPUtils.get(application,AppConfig.NEED_UP_ORDER,"") as String
// if (!orderString.isNullOrEmpty()){
// var order = Gson().fromJson(orderString,OrderDetailBean::class.java)
// GDLocationUtils.instance.getLocation(application){
// loadLocation(it,order)
//
// }
// }else{
//
// }
}
}
false
}
private val formatter: DateFormat = SimpleDateFormat("yyyy-MM-dd")
private val formatter2: DateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
override fun onBind(intent: Intent?): IBinder? {
return null
}
override fun onRebind(intent: Intent?) {
super.onRebind(intent)
}
private val timeSum = 1000 * 60 * 3
// private val timeSum = 3000
private var timer: Timer? = null
override fun onCreate() {
super.onCreate()
Log.e("开始循环上传等待100ms", "-----")
timer = Timer()
timer?.schedule(object : TimerTask() {
override fun run() {
val msg = Message.obtain()
msg.what = 123
hd.sendMessage(msg)
}
}, 1000, timeSum.toLong())
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
return START_STICKY
}
private fun loadLocation(loc: AMapLocation, order: OrderDetailBean) {
DataManager.getInstance().driverUploadLocus(
UpLocation(
loc.latitude,
loc.longitude,
order.orderId,
order.waybillId
)
)
.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
.subscribe(BaseObserver(application, object : RxHttpCallBack<Any>() {
override fun onSuccess(t: CommonResponseBean<Any>) {
super.onSuccess(t)
}
}))
}
override fun onDestroy() {
super.onDestroy()
if (timer != null) {
timer?.cancel()
timer = null
}
}
}

View File

@ -92,6 +92,7 @@ class HomeActivity : BaseActivity<ActivityHomeBinding>(), OnTabSelectListener,
Manifest.permission.CAMERA, Manifest.permission.CAMERA,
Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_BACKGROUND_LOCATION, Manifest.permission.ACCESS_BACKGROUND_LOCATION,
) )

View File

@ -1,11 +1,9 @@
package com.dahe.gldriver.ui.home package com.dahe.gldriver.ui.home
import android.Manifest import android.Manifest
import android.content.Intent
import android.graphics.Color import android.graphics.Color
import android.os.Bundle import android.os.Bundle
import android.widget.LinearLayout import android.widget.LinearLayout
import android.widget.Toast
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.dahe.gldriver.R import com.dahe.gldriver.R
@ -14,6 +12,7 @@ import com.dahe.gldriver.adapter.WaybillAdapter
import com.dahe.gldriver.base.AppConfig import com.dahe.gldriver.base.AppConfig
import com.dahe.gldriver.base.WebActivity import com.dahe.gldriver.base.WebActivity
import com.dahe.gldriver.bean.GridBean import com.dahe.gldriver.bean.GridBean
import com.dahe.gldriver.bean.OrderDetailBean
import com.dahe.gldriver.databinding.FragmentHomeBinding import com.dahe.gldriver.databinding.FragmentHomeBinding
import com.dahe.gldriver.net.BaseObserver import com.dahe.gldriver.net.BaseObserver
import com.dahe.gldriver.net.DataManager import com.dahe.gldriver.net.DataManager
@ -159,6 +158,9 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(), RefreshCallBack {
) )
} }
})) }))
//执行中运单轨迹上传
OrderUtils.getInstance().upLocation(mContext)
} }
private fun initRecy() { private fun initRecy() {

View File

@ -1,17 +1,26 @@
package com.dahe.gldriver.utils package com.dahe.gldriver.utils
import android.content.Context import android.content.Context
import android.content.Intent
import android.os.Bundle import android.os.Bundle
import com.dahe.gldriver.base.App
import com.dahe.gldriver.base.AppConfig import com.dahe.gldriver.base.AppConfig
import com.dahe.gldriver.base.AppConfig.NEED_UP_ORDER
import com.dahe.gldriver.bean.CarBean import com.dahe.gldriver.bean.CarBean
import com.dahe.gldriver.bean.OrderDetailBean
import com.dahe.gldriver.bean.UpLocation
import com.dahe.gldriver.callback.OnResultListener import com.dahe.gldriver.callback.OnResultListener
import com.dahe.gldriver.net.BaseObserver import com.dahe.gldriver.net.BaseObserver
import com.dahe.gldriver.net.DataManager import com.dahe.gldriver.net.DataManager
import com.dahe.gldriver.net.RxHttpCallBack import com.dahe.gldriver.net.RxHttpCallBack
import com.dahe.gldriver.service.UpLocationService
import com.dahe.gldriver.ui.waybill.activity.WaybillLoadActivity import com.dahe.gldriver.ui.waybill.activity.WaybillLoadActivity
import com.dahe.mylibrary.base.SingletonNoPHolder import com.dahe.mylibrary.base.SingletonNoPHolder
import com.dahe.mylibrary.net.CommonResponseBean import com.dahe.mylibrary.net.CommonResponseBean
import com.dahe.mylibrary.utils.ActivityUtils import com.dahe.mylibrary.utils.ActivityUtils
import com.dahe.mylibrary.utils.BaseSPUtils
import com.google.gson.Gson
import com.gyf.cactus.Cactus
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.schedulers.Schedulers import io.reactivex.rxjava3.schedulers.Schedulers
@ -83,7 +92,7 @@ class OrderUtils private constructor() {
* *
* 接单包含选择车辆->装货 * 接单包含选择车辆->装货
* */ * */
fun goReceWaybill(context: Context, orderId: String,listener:OnResultListener) { fun goReceWaybill(context: Context, orderId: String, listener: OnResultListener) {
//选择车辆 //选择车辆
DataManager.getInstance().carList() DataManager.getInstance().carList()
.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
@ -95,7 +104,7 @@ class OrderUtils private constructor() {
CommonPopUtils.getInstance() CommonPopUtils.getInstance()
.showCarList(context, t.data) { .showCarList(context, t.data) {
//接单接口 //接单接口
receivingOrders(context, orderId, it,listener) receivingOrders(context, orderId, it, listener)
} }
} else { } else {
//单量车,直接默认当前车辆 ,接单接口 //单量车,直接默认当前车辆 ,接单接口
@ -141,4 +150,37 @@ class OrderUtils private constructor() {
}) })
) )
} }
/**
* 上传运行中运单轨迹
* @param context Context
*/
fun upLocation(context: Context) {
DataManager.getInstance().orderDetail("")
.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
.subscribe(BaseObserver(context, object : RxHttpCallBack<OrderDetailBean>() {
override fun onSuccess(t: CommonResponseBean<OrderDetailBean>) {
super.onSuccess(t)
if (t.data != null) {
BaseSPUtils.put(context, NEED_UP_ORDER, Gson().toJson(t.data))
context.startService(Intent(context, UpLocationService::class.java))
// if (!Cactus.instance.isRunning(context)) {
// Cactus.instance.addCallback {
// context.startService(Intent(context, UpLocationService::class.java))
// }.restart(context)
// }else{
// Cactus.instance.addCallback {
// context.startService(Intent(context, UpLocationService::class.java))
// }.restart(context)
// }
// OrderUtils.getInstance().upLocation("","",t.data.orderId,t.data.waybillId)
} else {
context.stopService(Intent(context, UpLocationService::class.java))
BaseSPUtils.remove(context, NEED_UP_ORDER)
}
}
}))
}
} }

Binary file not shown.

View File

@ -91,7 +91,8 @@ dependencies {
api 'com.github.jenly1314.AppUpdater:app-updater:1.2.0' api 'com.github.jenly1314.AppUpdater:app-updater:1.2.0'
api 'com.github.jenly1314.AppUpdater:app-dialog:1.2.0' api 'com.github.jenly1314.AppUpdater:app-dialog:1.2.0'
// api 'com.gyf.cactus:cactus:1.1.3-beta13' api 'com.gyf.cactus:cactus:1.1.3-beta13'

View File

@ -0,0 +1,238 @@
package com.dahe.mylibrary.utils;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
/**
* @ClassName FileIOUtils
* @Author john
* @Date 2024/3/29 09:50
* @Description TODO
*/
public class FileIOUtils {
private FileIOUtils() {
throw new UnsupportedOperationException("u can't instantiate me...");
}
private static final String LINE_SEP = System.getProperty("line.separator");
/**
* 将输入流写入文件
*
* @param filePath 路径
* @param is 输入流
* @return {@code true}: 写入成功<br>{@code false}: 写入失败
*/
public static boolean writeFileFromIS(String filePath, final InputStream is) {
return writeFileFromIS(FileUtils.getFileByPath(filePath), is, false);
}
/**
* 将输入流写入文件
*
* @param filePath 路径
* @param is 输入流
* @param append 是否追加在文件末
* @return {@code true}: 写入成功<br>{@code false}: 写入失败
*/
public static boolean writeFileFromIS(String filePath, final InputStream is, boolean append) {
return writeFileFromIS(FileUtils.getFileByPath(filePath), is, append);
}
/**
* 将输入流写入文件
*
* @param file 文件
* @param is 输入流
* @return {@code true}: 写入成功<br>{@code false}: 写入失败
*/
public static boolean writeFileFromIS(File file, final InputStream is) {
return writeFileFromIS(file, is, false);
}
/**
* 将输入流写入文件
*
* @param file 文件
* @param is 输入流
* @param append 是否追加在文件末
* @return {@code true}: 写入成功<br>{@code false}: 写入失败
*/
public static boolean writeFileFromIS(File file, final InputStream is, boolean append) {
if (!FileUtils.createOrExistsFile(file) || is == null) return false;
OutputStream os = null;
try {
os = new BufferedOutputStream(new FileOutputStream(file, append));
byte data[] = new byte[1024];
int len;
while ((len = is.read(data, 0, 1024)) != -1) {
os.write(data, 0, len);
}
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
} finally {
try {
is.close();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 将字符串写入文件
*
* @param filePath 文件路径
* @param content 写入内容
* @return {@code true}: 写入成功<br>{@code false}: 写入失败
*/
public static boolean writeFileFromString(String filePath, String content) {
return writeFileFromString(FileUtils.getFileByPath(filePath), content, false);
}
/**
* 将字符串写入文件
*
* @param filePath 文件路径
* @param content 写入内容
* @param append 是否追加在文件末
* @return {@code true}: 写入成功<br>{@code false}: 写入失败
*/
public static boolean writeFileFromString(String filePath, String content, boolean append) {
return writeFileFromString(FileUtils.getFileByPath(filePath), content, append);
}
/**
* 将字符串写入文件
*
* @param file 文件
* @param content 写入内容
* @return {@code true}: 写入成功<br>{@code false}: 写入失败
*/
public static boolean writeFileFromString(File file, String content) {
return writeFileFromString(file, content, false);
}
/**
* 将字符串写入文件
*
* @param file 文件
* @param content 写入内容
* @param append 是否追加在文件末
* @return {@code true}: 写入成功<br>{@code false}: 写入失败
*/
public static boolean writeFileFromString(File file, String content, boolean append) {
if (file == null || content == null) return false;
if (!FileUtils.createOrExistsFile(file)) return false;
BufferedWriter bw = null;
try {
bw = new BufferedWriter(new FileWriter(file, append));
bw.write(content);
bw.newLine();
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
} finally {
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 读取文件到字符串中
*
* @param filePath 文件路径
* @return 字符串
*/
public static String readFile2String(String filePath) {
return readFile2String(FileUtils.getFileByPath(filePath), null);
}
/**
* 读取文件到字符串中
*
* @param filePath 文件路径
* @param charsetName 编码格式
* @return 字符串
*/
public static String readFile2String(String filePath, String charsetName) {
return readFile2String(FileUtils.getFileByPath(filePath), charsetName);
}
/**
* 读取文件到字符串中
*
* @param file 文件
* @return 字符串
*/
public static String readFile2String(File file) {
return readFile2String(file, null);
}
/**
* 读取文件到字符串中
*
* @param file 文件
* @param charsetName 编码格式
* @return 字符串
*/
public static String readFile2String(File file, String charsetName) {
if (!FileUtils.isFileExists(file)) return null;
BufferedReader reader = null;
try {
StringBuilder sb = new StringBuilder();
if (isSpace(charsetName)) {
reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
} else {
reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), charsetName));
}
String line;
while ((line = reader.readLine()) != null) {
sb.append(line).append(LINE_SEP);
}
// delete the last line separator
return sb.delete(sb.length() - LINE_SEP.length(), sb.length()).toString();
} catch (IOException e) {
e.printStackTrace();
return null;
} finally {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private static boolean isSpace(String s) {
if (s == null) return true;
for (int i = 0, len = s.length(); i < len; ++i) {
if (!Character.isWhitespace(s.charAt(i))) {
return false;
}
}
return true;
}
}